如何禁用Guzzle查询参数URL编码以保留日期参数格式?
解决方案
问题原因
- 日期未以字符串传递:代码中
transactionDateFrom和transactionDateTo的值未加引号,PHP会把2023-01-24T00:00:00.000Z解析为算术表达式(2023-1-24),再拼接后续字符,导致日期格式彻底错乱。 - 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
相关产品推荐
相关产品推荐

