API请求在Postman、Resteasy可用,PHP cURL调用报500错误求助
排查PHP cURL调用API出现500错误的问题
我来帮你捋一捋这个问题——Postman和Resteasy都能正常请求,但PHP cURL跑就出500,大概率是请求的细节没对齐,咱们一步步排查:
1. 最可能的原因:缺失Content-Type请求头
Postman在发送JSON请求时,会自动添加Content-Type: application/json头,但生成的PHP cURL代码里漏掉了这个关键配置!服务器收到请求后,没法识别请求体是JSON格式,直接抛出500错误。
2. 手动转义JSON容易出问题
你代码里的CURLOPT_POSTFIELDS是手动转义的字符串,很容易因为转义不全或者格式错误导致服务器解析失败。用PHP的json_encode()来生成JSON字符串更可靠,能避免这类低级错误。
3. 错误信息捕获不全
目前的代码只捕获了cURL本身的错误,但HTTP 500是服务器端错误,你需要获取HTTP状态码和服务器返回的具体错误信息,才能知道问题出在哪。
修改后的代码示例
把这些问题都修复后的代码应该是这样的:
$curl = curl_init(); // 先把请求数据写成PHP数组,再转成JSON,避免手动转义出错 $postData = [ [ "phone_number" => "40404", "message" => "whois @akborodo", "device_id" => 82531 ] ]; curl_setopt_array($curl, array( CURLOPT_URL => "https://smsgateway.me/api/v4/message/send", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode($postData), // 用json_encode生成标准JSON CURLOPT_HTTPHEADER => array( "authorization: <api-key>", "cache-control: no-cache", "Content-Type: application/json" // 必须添加这个头! ), CURLOPT_VERBOSE => true, // 开启详细日志,方便排查请求细节 )); $response = curl_exec($curl); $err = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // 获取HTTP状态码 curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo "HTTP状态码: " . $httpCode . "<br>"; echo "服务器响应: " . $response; }
下一步排查
如果修改后还是有问题,你可以:
- 查看
CURLOPT_VERBOSE输出的详细请求日志,对比Postman里的请求头和请求体,看是否还有差异(比如编码、额外的请求头) - 检查服务器返回的响应内容,哪怕是500错误,服务器通常会返回具体的错误描述,帮你定位问题
内容的提问来源于stack exchange,提问作者Sadiq Umar
相关产品推荐
相关产品推荐

