Node.js API无法读取PHP CURL请求数据,Postman请求正常
PHP CURL 调用Node.js API无响应排查方案
我尝试用PHP CURL向Node.js API发送POST请求,但完全收不到响应。这个API用Postman测试是正常的,我的代码如下:
$username = trim($this->request->getVar('username')); $password = $this->request->getVar('password'); $data = json_encode(array("email"=>$username,"password"=>$password)); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => API_URL.'/user/login', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>$data, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'Accept: application/json', 'Content-Length: ' . mb_strlen($data) ), )); $response = curl_exec($curl);
排查步骤及修复建议
- 先查CURL错误信息:
curl_exec后一定要加错误检测,否则根本不知道哪里出问题。添加以下代码:if(curl_errno($curl)){ echo 'CURL错误:' . curl_error($curl); } curl_close($curl); - 移除手动设置的
Content-Length:CURL会自动计算并设置正确的字节长度,用mb_strlen得到的是字符数,不是字节数,当JSON包含中文等多字节字符时会导致长度不匹配,API可能直接丢弃请求。 - 设置合理的超时时间:
CURLOPT_TIMEOUT => 0会导致无限等待,改成30秒左右的合理值,避免脚本挂死。 - 核对请求地址和Postman完全一致:确认
API_URL包含正确的http://或https://,路径、端口和Postman里的完全相同,没有拼写错误。 - 检查JSON编码是否成功:
json_encode可能因为特殊字符失败,添加检测:if($data === false){ echo 'JSON编码失败:' . json_last_error_msg(); exit; } - 匹配Postman的请求头:有些API会校验
User-Agent等头信息,把Postman里的请求头原样加到CURL的CURLOPT_HTTPHEADER里,比如添加'User-Agent: PostmanRuntime/7.32.3'。
修改后的示例代码
$username = trim($this->request->getVar('username')); $password = trim($this->request->getVar('password')); $data = json_encode(["email" => $username, "password" => $password]); // 检查JSON编码 if ($data === false) { die('JSON编码错误: ' . json_last_error_msg()); } $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => API_URL . '/user/login', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, // 合理超时 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => $data, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json', 'User-Agent: PHP-CURL/7.4' // 和Postman保持一致 ], ]); $response = curl_exec($curl); // 检查CURL错误 if (curl_errno($curl)) { die('CURL错误: ' . curl_error($curl)); } curl_close($curl); // 打印响应调试 var_dump($response);
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

