Postman中正常运行的API在PHP CURL中无法调用求助
排查建议与解决方案
核心问题定位
你的PHP CURL代码和Postman请求的关键差异在于缺少Content-Type: application/json请求头,同时没有正确输出调试日志来定位问题。
具体排查步骤
- 强制添加JSON请求头:Postman发送JSON格式请求时会自动携带
Content-Type: application/json,但你的代码注释掉了这个配置,服务器无法识别请求体格式,导致处理失败。 - 输出CURL调试日志:开启
CURLOPT_VERBOSE后,需要将日志输出到可见位置,才能看到请求过程中的错误(比如HTTP状态码、服务器返回的错误信息)。 - 修复错误的代码细节:代码中
len($data)是无效函数,PHP中字符串长度用strlen(),不过CURL会自动计算Content-Length,无需手动设置。 - 谨慎关闭SSL验证:
CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER设为0会跳过证书验证,仅适合测试环境,生产环境建议配置正确的CA证书。
修复后的完整代码
<?php $data = [ 'prompt' => "write me a poem", 'use_buffer' => 1 ]; $api_url = "https://myserver.com"; $ch = curl_init(); // 生产环境建议移除这两行,配置正确的SSL证书 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // 必须添加的JSON请求头 $headers = [ 'Accept: application/json', 'Content-Type: application/json' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 输出调试日志到屏幕 $verbose = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $verbose); $response = curl_exec($ch); // 打印调试日志 rewind($verbose); $verboseLog = stream_get_contents($verbose); echo "Verbose Log:\n" . $verboseLog . "\n"; if(curl_errno($ch)){ echo "CURL Error: " . curl_error($ch); } curl_close($ch); var_dump($response); print("<br>"); ?>
额外调试技巧
- 对比Postman的请求详情:在Postman中点击「Code」按钮,选择PHP - cURL,直接生成标准请求代码,和你的代码逐行对比差异。
- 检查HTTP状态码:用
curl_getinfo($ch, CURLINFO_HTTP_CODE)获取响应状态码,4xx表示客户端请求错误,5xx表示服务器端错误。
内容的提问来源于stack exchange,提问作者popa big
相关产品推荐
相关产品推荐

