Php 通过guzzle中的查询字符串发送数组

Php 通过guzzle中的查询字符串发送数组,php,rest,query-string,restful-url,guzzle,Php,Rest,Query String,Restful Url,Guzzle,默认情况下,客户端根据此代码创建 $client->get('https://example.com/{?a}', array('a' => array('c','d'))); 此url https://example.com/?a=c,d 在RESTful应用程序中以查询字符串形式发送数组的最佳实践是什么?问题是,如何在服务器端确定c,d是字符串还是数组?使用方括号发送数组不是更好吗,例如a[]=c&a[]=d?如何将Guzzle设置为使用方括号?还是使用JSON编码的变量更好

默认情况下,客户端根据此代码创建

$client->get('https://example.com/{?a}', array('a' => array('c','d')));
此url

https://example.com/?a=c,d
在RESTful应用程序中以查询字符串形式发送数组的最佳实践是什么?问题是,如何在服务器端确定
c,d
是字符串还是数组?使用方括号发送数组不是更好吗,例如
a[]=c&a[]=d
?如何将Guzzle设置为使用方括号?还是使用JSON编码的变量更好?在我使用的服务器端。

答案似乎是

我想做一些类似于
?status[]=first和status[]=second

您可以在Guzzle中执行此操作,如上面的链接所示:

$client = new Client('http://test.com/api');    
$request = $client->get('/resource');    
$query = $request->getQuery();    
$query->set('status', array('first', 'second'));
工作解决方案:

$vars = array('state[]' => array('Assigned','New'), 'per_page' => $perPage, 'page' => $pageNumber);
$query = http_build_query($vars, null, '&');
$string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query); // state[]=Assigned&state[]=New
$client = new Client([follow instruction to initialize your client ....]);
$response = $client->request('GET', $uri, ['query' => $string]);
现在您的请求中有了相同的名称参数


资料来源:

我不能100%肯定这完全回答了这个问题。但是我在寻找如何使用Guzzle构造复杂查询时发现了这个问题,这里的答案都不是我最终使用的解决方案。我在这里添加它,以防它对任何其他开发人员有用

使用Guzzle 6,您可以执行以下类型的请求:

$endPoint=”https://example.com";
$queryParams=[
“a”=>[
[
“b”=>“c”
]
]
];
$options=[
'debug'=>true,//因此您可以查看请求的外观
“查询”=>$queryParams
];
$client->request('GET',$endPoint,$options);
作为一个真实的示例,查询参数如下:

$queryParams=[
“过滤器”=>[
[
“字段”=>“状态”,
“值”=>“打开”,
“运算符”=>“相等”
],
[
“字段”=>“总计”,
“运算符”=>“大于”,
“值”=>50
],
],
“限制”=>500,
“开始”=>7
];
生成如下url:

https://example.com?filters=[{“字段”:“状态”,“运算符”:“相等”,“值”:“打开”},{“字段”:“总计”,“运算符”:“小于”,“值”:50}]&限制=500&开始=7

关键是
$options
数组的
查询
键似乎非常强大。我建议在开始编写复杂的正则表达式之前,先玩一下这个游戏

$query = array('x' => array(
                    'a',
                    'b',
                    'c'
        ));

$query_string = http_build_query($query, null, '&'); //build query string

$query_string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '[]=', $query_string); //x[]=a&x[]=b

$response = $guzzle->client->get($path, array('query' => $query_string)); //Make guzzle request

return json_decode($response->getBody()->getContents()); //Return JSON decoded array

这就是如何使用guzzle中的值数组处理
x
,使用版本6或更高版本测试guzzle有一个名为
build\u query()
的帮助函数。这使用PHP的
http\u build\u query()

下面是一个如何使用它的示例:

$params = [
    'a[]' => [
        'c',
        'd'
    ],
    'page' => 1
];

$query = \GuzzleHttp\Psr7\build_query($params);

$response = $client->request('GET', 'https://example.com/', [
    'query' => $query
]);

我也对这个感兴趣