Guzzle客户端默认根据此代码创建
$client->get('https://example.com/{?a}', array('a' => array('c','d')));
此网址
https://example.com/?a=c,d
在RESTful应用程序中的查询字符串中发送数组的最佳做法是什么?问题是,如何在服务器端确定c,d
是字符串还是数组?使用方括号发送数组不是更好吗a[]=c&a[]=d
?如何设置Guzzle使用方括号?或者最好使用JSON编码变量?在服务器端,我正在使用Tonic。
答案 0 :(得分:4)
工作解决方案:
$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]);
现在您的请求中有相同的名称参数。
粪。
答案 1 :(得分:3)
似乎答案是here。
我想做?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'));
答案 2 :(得分:2)
Guzzle 有一个名为 build_query()
的辅助函数,您可以使用它。这使用 PHP 的 http_build_query()
。
以下是如何使用它的示例:
$params = [
'a[]' => [
'c',
'd'
],
'page' => 1
];
$query = \GuzzleHttp\Psr7\build_query($params);
$response = $client->request('GET', 'https://example.com/', [
'query' => $query
]);
答案 3 :(得分:0)
我不是100%肯定会回答这个问题。但是我在寻找如何使用Guzzle构造复杂查询时发现了问题,这里没有答案是我最终使用的解决方案。我将其添加到此处,以防其他开发人员使用。
使用Guzzle 6,您可以执行以下类型的请求:
acf_form()
作为一个真实的例子,查询如下参数:
$endPoint = "https://example.com";
$queryParams = [
'a' => [
[
"b" => "c"
]
]
];
$options = [
'debug' => true, // so you can see what the request looks like
'query' => $queryParams
];
$client->request('GET', $endPoint, $options);
生成这样的网址:
$queryParams = [
'filters' => [
[
"field" => "status",
"value" => "open",
"operator" => "equal"
],
[
"field" => "total",
"operator" => "greater_than",
"value" => 50
],
],
'limit' => 500,
'start' => 7
];
关键是https://example.com?filters=[{"field":"status","operator":"equal","value":"open"},{"field":"total","operator":"less_than","value":50}]&limit=500&start=7
数组的query
键似乎非常强大。我建议您先尝试一下,再尝试编写复杂的正则表达式。
答案 4 :(得分:0)
$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
这是您如何处理x
的值数组,并经过版本6或更高版本测试的方法