任何人都知道如何将Zend \ Http \ Request(或者可能是在Zend \ Stdlib \ ParametersInterface的实现者中)哄骗到创建url,其中数组查询arg键不包含索引。
我正在尝试使用Zend \ Http \ Request对象在GET请求上传递一个值数组作为查询参数。
...
$httpClient = new Zend\Http\Client(); // cURL adapter setup omitted
$request = new Zend\Http\Request(); // set url, set GET method omitted
$myQueryArgArray = [
'key0' => 'val0',
'key1' => ['val1', 'val2'],
];
$request->getQuery()->fromArray($myQueryArgArray);
$response = $httpClient->send($request);
...
cURL适配器正在向门外发送一个如下所示的网址:
hostname/path?key0=val0&key1%5B0%5D=val1&key1%5B1%5D=val2
没有编码:
hostname/path/?key0=val0&key1[0]=val1&key1[1]=val2
但是,除非我在查询字符串中 NOT 传递索引,否则我调用的服务器将失败。也就是说,在URL编码之前,我可以使用以下网址调用我的API端点:
hostname/path?key0=val0&key1[]=val1&key1[]=val2
任何人都知道如何将Zend \ Http \ Request(或者可能是在Zend \ Stdlib \ ParametersInterface的实现者中)哄骗到创建url,其中数组查询arg键不包含索引。
我已经尝试将我的数组包装在Zend \ Stdlib \ ArrayObject中:
...
$myQueryArgArray = [
'key0' => 'val0',
'key1' => new \Zend\StdLib\ArrayObject(['val1', 'val2']),
];
...
唉,无济于事。
我知道我通过手动构建查询字符串并将其直接交给Zend \ Http \ Request对象来实现目标,但我正在寻找一种比创建自己的查询字符串更好的方法。
这个页面似乎表明没有标准,所以我认为ZF2和我的api端点都没有做错:
How to pass an array within a query string?
答案 0 :(得分:2)
我查看了来源,问题不是Zend\Http\Request类,而是Zend\Http\Client。
看看line 843您看到了对http_build_query功能的调用。在php.net网站上,您可以在评论中找到解决方案:
$query = http_build_query($query);
$query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
所以最干净的解决方案可能是扩展Zend\Http\Client
类并覆盖send
方法。