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

如何禁用Guzzle查询参数URL编码以保留日期参数格式?

解决方案

问题原因

  1. 日期未以字符串传递:代码中transactionDateFrom和transactionDateTo的值未加引号,PHP会把2023-01-24T00:00:00.000Z解析为算术表达式(2023-1-24),再拼接后续字符,导致日期格式彻底错乱。
  2. Guzzle默认URL编码:Guzzle会自动对URL参数中的特殊字符(如冒号:)进行URL编码,转换为%3A,不符合目标端点的格式要求。

修复步骤

1. 将日期值改为字符串类型

给日期参数添加单引号或双引号,确保PHP将其识别为字符串,避免表达式解析:

'transactionDateFrom' => '2023-01-24T00:00:00.000Z',
'transactionDateTo' => '2023-01-24T15:59:59.000Z'

2. 配置Guzzle保留冒号的原始格式

提供两种可行方式控制参数编码:

方式一:自定义编码回调

通过query的encoding参数指定回调函数,仅编码必要字符,保留冒号:

$req = $client->request('GET', 'https://test.com/sales/transaction/', [
    'query' => [
        'page'                  => 1,
        'pageSize'              => 5,
        'transactionDateFrom'   => '2023-01-24T00:00:00.000Z',
        'transactionDateTo'     => '2023-01-24T15:59:59.000Z'
    ],
    'encoding' => function ($value) {
        // 编码后再替换回冒号
        return str_replace('%3A', ':', rawurlencode($value));
    },
    'headers' => $headers
]);

方式二:手动拼接查询字符串

直接拼接预格式化的查询字符串,跳过Guzzle的自动编码:

// 构建基础查询参数
$queryParams = [
    'page'                  => 1,
    'pageSize'              => 5,
    'transactionDateFrom'   => '2023-01-24T00:00:00.000Z',
    'transactionDateTo'     => '2023-01-24T15:59:59.000Z'
];
// 生成查询字符串并还原冒号
$queryString = str_replace('%3A', ':', http_build_query($queryParams));

// 直接拼接URL发送请求
$req = $client->request('GET', 'https://test.com/sales/transaction/?' . $queryString, [
    'headers' => $headers
]);

验证效果

修复后,请求URL的日期参数会保持transactionDateFrom=2023-01-24T00:00:00.000Z&transactionDateTo=2023-01-24T15:59:59.000Z的正确格式,符合目标端点要求。

内容的提问来源于stack exchange,提问作者Helsinki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:55:23