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

Sae*_*ven 5 php guzzle guzzle6

从 5 迁移到 6,我遇到了一个障碍,找不到相关的文档。

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

我想在每个请求中发送“foo=bar”。例如:

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

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

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

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

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

谢谢你的帮助!

Sae*_*ven 7

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

        $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,
        ]);
Run Code Online (Sandbox Code Playgroud)

如果有人知道如何使它看起来不那么险恶,我会说谢谢!


Daz*_*win 5

在这里找到了一个很好的解决方案。

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

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

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

然后,在使用客户端时:

$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);
Run Code Online (Sandbox Code Playgroud)

值得注意的是array_merge_recursive函数附加到嵌套数组而不是覆盖。如果您计划更改默认值,则需要不同的实用函数。当默认值不可变时,它可以很好地工作。

  • 但是,如果您在应用程序的不同部分使用多个 Guzzle 请求,则必须记住在每次调用时都多放一行。使用中间件配置它可以更好地抽象恕我直言 (2认同)
  • 同样的@NicoHaase,我就是用我的静态类(严格来说不是工厂模式,但非常相似)这样做,我总是对 Guzzle 客户端这样做。就我个人而言,我一直觉得 guzzle 中间件文档对于如此庞大的功能有些缺乏。问题是,当我偶然发现这个问题时,我想做的就是将 `key=val` 添加到来自某个特定 guzzle 客户端的所有请求的 URL 中。我觉得没有必要花时间浏览各种文档来源。任何更复杂的事情,萨文的解决方案肯定是这样的 (2认同)