【问题标题】:How to avoid sending a Guzzle request after instantiation?如何避免实例化后发送 Guzzle 请求?
【发布时间】:2015-04-23 15:37:09
【问题描述】:

上下文: Laravel 5. Guzzle ~5.2。 PHP 5.4。我正在构建一个类来与外部 API 交互。我正在为这个类提供一个使用服务提供者的 Guzzle 客户端,以避免在方法中实例化客户端。

我想缓存结果。如果用户正在请求在缓存中找到的内容,请将其返回而不是对所述 API 执行请求。

问题:如果我构建了一个 Guzzle 客户端并且不执行请求,应用程序就会崩溃。 甚至没有来自 PHP 的堆栈跟踪。实际上,如果我使用 Laravel 的 artisan serve,则会出现一条 Windows 错误消息,提示 PHP CLI 已停止工作。

现在,我每次调用时都会将 Guzzle 客户端传递给我的类上的方法。

有没有办法只实例化 Guzzle 客户端而不发送请求?你会选择什么其他途径来实现这一目标?这是预期的行为吗?

【问题讨论】:

    标签: php laravel guzzle


    【解决方案1】:

    tl;dr RTM

    更长的版本(来自文档):

    创建请求 您可以在不发送的情况下创建请求。这对于随着时间的推移构建请求或同时发送请求很有用。

    $request = $client->createRequest('GET', 'http://httpbin.org', [
        'headers' => ['X-Foo' => 'Bar']
    ]);
    

    //根据需要修改请求

    $request->setHeader('Baz', 'bar');
    

    创建请求后,可以使用客户端的 send() 方法发送。

    $response = $client->send($request);
    

    【讨论】:

    • 这是错误的,不起作用。客户端没有功能createRequest
    【解决方案2】:

    从这里: http://docs.guzzlephp.org/en/stable/quickstart.html#making-a-request

        use GuzzleHttp\Psr7\Request;
    
    $client = new Client([
        // Base URI is used with relative requests
        'base_uri' => 'http://httpbin.org',
        // You can set any number of default request options.
        'timeout'  => 2.0,
    ]);
    
        $request = new Request('PUT', 'http://httpbin.org/put');
        $response = $client->send($request, ['timeout' => 2]);
    

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2019-12-12
      • 2016-06-09
      • 2018-02-07
      • 2017-08-28
      • 1970-01-01
      • 2015-12-03
      • 2020-07-14
      • 2018-06-02
      相关资源
      最近更新 更多