You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:26:11