【问题标题】:Can I add middleware to the default Guzzle 6 HandlerStack, rather than creating a new stack?我可以将中间件添加到默认的 Guzzle 6 HandlerStack,而不是创建一个新堆栈吗?
【发布时间】:2017-09-01 08:08:51
【问题描述】:

我正在以相当标准的方式使用Spatie\Crawler爬虫软件,如下所示:

$client = new Client([
    RequestOptions::COOKIES => true,
    RequestOptions::CONNECT_TIMEOUT => 10,
    RequestOptions::TIMEOUT => 10,
    RequestOptions::ALLOW_REDIRECTS => true,
]);
$crawler = new Crawler($client, 1);
$crawler->
    setCrawlProfile(new MyCrawlProfile($startUrl, $pathRegex))->
    setCrawlObserver(new MyCrawlObserver())->
    startCrawling($url);

为简洁起见,我省略了 MyCrawlObserver 的类 MyCrawlProfile 的定义,但无论如何,这可以正常工作。

我想添加一些中间件,以便在发出请求之前更改它们,所以我添加了这个演示代码:

$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(
    Middleware::mapRequest(function (RequestInterface $request) {
        echo "Middleware running\n";

        return $request;
    })
);
$client = new Client([
    RequestOptions::COOKIES => true,
    RequestOptions::CONNECT_TIMEOUT => 10,
    RequestOptions::TIMEOUT => 10,
    RequestOptions::ALLOW_REDIRECTS => true,
    'handler' => $stack,
]);
// ... rest of crawler code here ...

但是,它遇到了第一个障碍 - 它会抓取站点的根目录 (/),这实际上是一个 Location 重定向,然后停止。事实证明我现在错过了RedirectMiddleware,尽管没有故意删除它。

所以,我的问题也通过添加以下内容得到解决:

$stack->push(Middleware::redirect());

我现在想知道在 Guzzle 中默认设置了哪些其他内容,我通过创建一个新的 HandlerStack 意外删除了这些内容。饼干?重试机制?其他的东西?我现在不需要这些东西,但如果我的代码只是修改现有堆栈,我会对系统的长期可靠性更有信心。

有没有办法做到这一点?据我所知,我正在做事as per the manual

【问题讨论】:

    标签: php middleware guzzle guzzle6


    【解决方案1】:
    $stack = HandlerStack::create();
    

    而不是

    $stack = new HandlerStack();
    $stack->setHandler(new CurlHandler());
    

    这很重要,因为create() 添加了额外的中间件,尤其是对于重定向。

    【讨论】:

    • 太棒了,就是这样-谢谢。而且,事实证明,如果我阅读了整个页面,我会在文档中发现这一点 - 我想我正在变得代码失明:-)
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2016-03-21
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2012-04-18
    相关资源
    最近更新 更多