我有这个代码用于创建带有日志记录的 Guzzle 客户端:
$loggerMiddleware = new Logger(function ($level, $message, array $context) { ... }
$handler = new CurlMultiHandler();
$stack = HandlerStack::create($handler);
$stack->push($loggerMiddleware);
$client = new Client(['handler' => $stack]);
现在,当我使用另一种处理程序
$handler = new CurlHandler();
时,Logger 函数会为我提供完整的详细信息 $context
数组,其中包含有关请求和响应的详细信息。
问题是,当我切换到
$handler = new CurlMultiHandler();
时,$context
数组不再有可用的响应,$context['response']
当它是MultiHandler时就没有意义了。
如何编写一个记录器函数来获取 CurlMultiHandler 的响应?
编辑:当我在记录器回调中使用无用的
$context['response']
时,我注意到我可以检查$context['reason']
并且看到此消息:
cURL 错误 61:无法识别的内容编码类型。 libcurl 理解 deflate、gzip 内容编码。 (参见 https://curl.haxx.se/libcurl/c/libcurl-errors.html) https://courierservices.saasc.uk/api/couriers/v1/Test/create-label
在 Laravel 中,如果您使用内置的 Laravel HTTP 客户端(在后台使用 Guzzle 的 HTTP 客户端),则可以监听
Illuminate\Http\Client\Events\ResponseReceived
事件。该事件提供了两个公共属性:
Illuminate\Http\Client\Request
类的实例,您可以使用它来进一步访问有关正在完成的传出请求的更多详细信息。Illuminate\Http\Client\Response
类的实例,您可以使用它来进一步访问有关传入响应的更多详细信息。您可能想创建一个侦听器来侦听此事件,例如:
<?php
namespace App\Listeners;
use Illuminate\Http\Client\Events\ResponseReceived;
class LogGuzzleResponse
{
/**
* Handle the event.
*/
public function handle(ResponseReceived $event): void
{
info($event->request->headers());
info($event->request->body());
info($event->response->headers());
info($event->response->body());
}
}
然后您可以将此侦听器绑定到
$listen
类的 App\Providers\EventServiceProvider
属性内的事件,如下所示:
<?php
namespace App\Providers;
use App\Listeners\LogGuzzleResponse;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Http\Client\Events\ResponseReceived;
class EventServiceProvider extends ServiceProvider
{
/**
* The event to listener mappings for the application.
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
ResponseReceived::class => [
LogGuzzleResponse::class
]
];
}
如您所见,这种方法根本不需要您使用任何中间件,并且可以无缝运行。