带Basic Authorization的Curl请求无法获取API Token问题
问题排查与修复方案
你的请求无返回大概率是请求格式不匹配导致的,结合代码来看,有几个关键问题需要修正:
1. 请求体格式与Content-Type声明冲突
你设置了Content-Type: application/json,但CURLOPT_POSTFIELDS传的是数组——PHP的curl会自动把数组编码为multipart/form-data格式,和你声明的JSON类型不匹配,服务端无法解析请求,因此没有返回内容。
修复方式:将POST数组转为JSON字符串:
CURLOPT_POSTFIELDS => json_encode([ 'grant_type' => 'password' ]),
2. 错误处理逻辑存在漏洞
当前代码仅在请求无错误时关闭curl资源,发生错误时curl资源会未被释放,应该调整为无论请求成功与否都关闭资源:
$response_received = curl_exec($curl); $curl_error = curl_errno($curl); $curl_error_msg = curl_error($curl); curl_close($curl); // 无论成功失败都释放资源 if($curl_error) { $response_received = $curl_error_msg; }
3. 增加调试信息辅助定位问题
可以添加获取HTTP状态码的代码,帮助判断请求是否到达服务端、服务端的响应状态:
// 执行请求后添加 $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); echo "<br><br>HTTP状态码: {$http_code}";
完整修正后的代码
$xurl = 'https://test-api.authtest.com/oauth2/token'; $userName = '76556789000023'; $password = '1hjgtyudkportd4451test'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $xurl, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => json_encode([ 'grant_type' => 'password' ]), CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_ENCODING => '', CURLOPT_USERPWD => $userName . ':' . $password, CURLOPT_HTTPHEADER => array( "Content-Type: application/json" ), )); $response_received = curl_exec($curl); $curl_error = curl_errno($curl); $curl_error_msg = curl_error($curl); $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if($curl_error) { $response_received = $curl_error_msg; } var_dump($response_received); echo "<br><br>"; print_r("<b>response_received</b><br>".$response_received); echo "<br><br>HTTP状态码: {$http_code}";
另外注意:CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER设置为0/false仅适合测试环境,生产环境必须开启SSL验证,避免安全风险。
内容的提问来源于stack exchange,提问作者userdev2222
相关产品推荐
相关产品推荐

