ZF2,将数组作为查询参数传递,尤其是 Zend\Http\Request

ZF2, Passing arrays as query parameters, esp in Zend\Http\Request

问题:

任何人都知道一种方法可以哄骗 Zend\Http\Request(或者它可能会在 Zend\Stdlib\ParametersInterface 的实现者中?)创建 urls,其中数组查询 arg 键不t 包含索引。

背景:

我正在尝试使用 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 适配器正在向门外发送请求,其中 url 看起来像这样:

hostname/path?key0=val0&key1%5B0%5D=val1&key1%5B1%5D=val2

没有编码:

hostname/path/?key0=val0&key1[0]=val1&key1[1]=val2

但是,除非我 NOT 在查询字符串中传递索引,否则我调用的服务器会失败。也就是说,在 URL 编码之前,我可以用 url 调用我的 API 端点,例如:

hostname/path?key0=val0&key1[]=val1&key1[]=val2

问题(再次:):

任何人都知道一种方法可以哄骗 Zend\Http\Request(或者它可能会在 Zend\Stdlib\ParametersInterface 的实现者中?)创建 urls,其中数组查询 arg 键不t 包含索引。

我尝试过的:

我试过用 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?

我查看了来源,问题不在于 Zend\Http\Request class but the Zend\Http\Client

查看line 843 you see a call to the http_build_query函数。在 php.net 站点上,您在评论中有解决方案:

$query = http_build_query($query);
$query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);

所以最干净的解决方案可能是扩展 Zend\Http\Client class 并覆盖 send 方法。