如何使用Guzzle 6配置默认查询参数?

时间:2016-08-04 00:50:29

标签: php guzzle guzzle6

从5迁移到6,我遇到了障碍,无法找到相关的文档。

Guzzle docs here http://guzzle.readthedocs.io/en/latest/quickstart.html#creating-a-client,我们可以添加“任意数量的默认请求选项”的网站。

我希望每次请求都发送“foo = bar”。 E.g:

$client = new Client([
    'base_uri' => 'http://google.com',
]);

$client->get('this/that.json', [
    'query' => [ 'a' => 'b' ],
]);

这将在http://google.com/this/that.json?a=b

上生成GET

如何修改客户端构造以使其产生:

http://google.com/this/that.json?foo=bar&a=b

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我找到了一个不错的解决方案here

基本上,第一个参数数组中定义的任何内容都将成为客户端config的一部分。

这意味着您可以在初始化时执行此操作:

$client = new Client([
    'base_uri' => 'http://google.com',
    // can be called anything but defaults works well
    'defaults' => [
        'query'  => [
            'foo' => 'bar',
        ]
    ]
]);

然后,在使用客户端时:

$options = [
    'query'  => [
        'nonDefault' => 'baz',
    ]
];

// merge non default options with default ones
$options = array_merge_recursive($options, $client->getConfig('defaults'));

$guzzleResponse = $client->get('this/that.json', $options);

值得注意的是,array_merge_recursive函数会附加到嵌套数组,而不是覆盖。如果计划更改默认值,则需要其他实用程序功能。当默认值不变时,它会很好地工作。

答案 1 :(得分:0)

好的,到目前为止,这可以在这里工作:

        $extraParams = [
            'a' => $config['a'],
            'b' => $config['b'],
        ];

        $handler = HandlerStack::create();
        $handler->push(Middleware::mapRequest(function (RequestInterface $request) use ($extraParams) {

            $uri  = $request->getUri();
            $uri .= ( $uri ? '&' : '' );
            $uri .= http_build_query( $extraParams );

            return new Request(
                $request->getMethod(),
                $uri,
                $request->getHeaders(),
                $request->getBody(),
                $request->getProtocolVersion()
            );
        }));

        $this->client = new Client([
            'base_uri' => $url,
            'handler' => $handler,
            'exceptions' => false,
        ]);

如果有人知道如何让它不那么险恶,我会说谢谢你!

答案 2 :(得分:0)

在github中提出的解决方案看起来很难看。这看起来并没有好多少,但至少更具可读性并且也可行。如果有人知道为什么不应该使用我,我希望获得反馈:

with open