我可以将中间件添加到默认的Guzzle 6 HandlerStack中,而不是创建新的堆栈吗?

时间:2017-04-06 10:36:30

标签: php middleware guzzle guzzle6

我以相当标准的方式使用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);

为简洁起见,我省略了MyCrawlProfile的{​​{1}}类的定义,但无论如何,这都是有效的。

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

MyCrawlObserver

然而,它落在第一个障碍上 - 它刮擦了网站的根($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

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

有办法吗?据我所知,我正在做事as per the manual

1 个答案:

答案 0 :(得分:2)

$stack = HandlerStack::create();

而不是

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

这很重要,因为create()会增加额外的中间件,特别是对于重定向。