PHP中CURL GET请求返回乱码,处理后返回空数组的问题
解决PHP CURL调用接口乱码后返回空数组的问题
问题分析
初始乱码是因为接口返回gzip压缩内容,PHP CURL默认未自动解码,添加curl_setopt($ch, CURLOPT_ENCODING, '')后乱码解决,但返回空数组[],说明解码逻辑正确,但请求本身和Postman/Talend的有效请求存在差异。
排查与解决步骤
1. 核对请求参数一致性
- 确认
customerId为有效值:代码中redacted是占位符,替换为实际可用的客户ID,再手动拼接完整URL到Postman测试,验证是否返回数据。 - 检查日期范围:对比Postman中使用的
startDate和endDate,确保代码中的日期区间和有效请求一致。比如代码中endDate取前一天,若服务器时区与接口时区不一致,可能导致日期偏差,可指定时区修正:date_default_timezone_set('UTC'); // 改为接口要求的时区 $endDateParameter = "&endDate=".date('Y-m-d',strtotime("-1 days"));
2. 调整请求头
GET请求无需携带Content-Type: application/json; charset=utf-8头,部分接口会对冗余头做异常处理,建议删除该头,保持请求头与Postman一致:
$headers = array(); $headers[] = 'Accept: application/json'; $headers[] = 'Authorization: '.$tokenType.' '.$accessToken; // 移除Content-Type头
3. 验证Token有效性
打印代码中获取的$accessToken和$tokenType,复制到Postman替换现有Token测试,确认Token未过期、权限正常。若Token无效,需检查APIAuthenticator.php的认证逻辑是否正确。
4. 开启CURL调试排查细节
添加调试代码,查看请求头、响应头及HTTP状态码,对比Postman的请求细节:
// 开启调试模式 curl_setopt($ch, CURLOPT_VERBOSE, true); $verbose = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verbose); // 执行请求后输出调试信息 $result = curl_exec($ch); rewind($verbose); $verboseLog = stream_get_contents($verbose); echo "CURL调试日志:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n"; // 输出HTTP状态码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "HTTP状态码: $httpCode\n";
- 若状态码为4xx,通常是参数错误或权限不足;5xx则为服务器端问题。
修改后的示例代码
$AuthJSON = include ("APIAuthenticator.php"); $jsonObject = json_decode($AuthJSON, false); $accessToken = $jsonObject->access_token; $tokenType = $jsonObject->token_type; // 替换为实际客户ID $customerIdParameter = "?customerId=your-real-customer-id"; // 指定时区避免日期偏差 date_default_timezone_set('UTC'); $startDateParameter = "&startDate=2024-06-01"; $endDateParameter = "&endDate=".date('Y-m-d',strtotime("-1 days")); $ch = curl_init(); $url = "https://api.hconnect.digital/ecs/v2/deliveries".$customerIdParameter.$startDateParameter.$endDateParameter; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 自动处理gzip压缩 curl_setopt($ch, CURLOPT_ENCODING, ''); $headers = array(); $headers[] = 'Accept: application/json'; $headers[] = 'Authorization: '.$tokenType.' '.$accessToken; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 开启调试 curl_setopt($ch, CURLOPT_VERBOSE, true); $verbose = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verbose); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } else { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "HTTP状态码: $httpCode\n"; var_dump($result); file_put_contents("GetDeliveriesList_Output.txt", $result); } // 输出调试日志 rewind($verbose); $verboseLog = stream_get_contents($verbose); echo "CURL调试日志:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n"; curl_close($ch);
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

