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
方法。
问题:
任何人都知道一种方法可以哄骗 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
方法。