PHP cURL发送自定义header失败返回302无接口数据问题求助
问题排查与解决方案
问题背景
我调用的API要求传入两个自定义请求头:Accept-Encoding和x-api-key,基于公开的PHP cURL教程修改后的代码如下:
$curl_handle = curl_init(); $url = "http://thelinktomyAPI"; $headers = array( 'Accept-Encoding: application/json', 'Content-Type: application/json', 'x-api-key: MyLongAPIKey' ); // 设置cURL请求地址 curl_setopt($curl_handle, CURLOPT_URL, $url); curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl_handle, CURLOPT_HEADER, true); curl_setopt($curl_handle, CURLOPT_ENCODING, 'application/json'); // 配置将请求结果以字符串形式返回,而非直接输出 curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true); $curl_data = curl_exec($curl_handle); if ($curl_data === false) { print_r('Curl error: ' . curl_error($curl_handle)); } curl_close($curl_handle); print_r($curl_data);
问题现象
开启响应头返回用于校验请求头发送状态时,得到的响应内容如下:
HTTP/1.1 302 Moved Temporarily Date: Thu, 02 Dec 2021 08:09:59 GMT Content-Type: text/html Content-Length: 110 Connection: keep-alive Location: http://thelinktomyAPI X-Trace-ID:f306fe34-079b-493c-b5db-073e792ec2a1 X-Kong-Response-Latency: 0 Server: kong/2.3.3 302 Found
最初判断是请求头未成功发送,导致接口返回异常的text/html类型内容,无法拿到正确的接口数据。
解决方案
在cURL配置中添加跟随重定向的参数即可解决问题:
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
原理说明
默认情况下cURL不会自动处理服务端返回的重定向响应,本次拿到的302响应是网关层的跳转提示,不是最终接口的返回结果。添加CURLOPT_FOLLOWLOCATION参数后,cURL会自动根据响应头中的Location字段指向的地址继续发起请求,最终拿到接口的正常返回数据。
额外优化建议
注意Accept-Encoding请求头通常用来指定客户端支持的压缩格式(如gzip、deflate),如果要指定接口返回数据格式为JSON,建议将对应请求头改为Accept: application/json,避免不必要的兼容性问题。
内容的提问来源于stack exchange,提问作者user2538515
相关产品推荐
相关产品推荐

