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

时间:2012-12-18 08:34:15

标签: php rest query-string restful-url guzzle

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

5 个答案:

答案 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]);

现在您的请求中有相同的名称参数。

粪。

来源:http_build_query with same name parameters

答案 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或更高版本测试的方法