Я планирую использовать Guzzle для связи с существующим REST API.Я хотел бы регистрировать все неудачные вызовы API с монологом.
Когда вызов API не успешен (код состояния HTTP отличается от ожидаемого), мне нужно зарегистрировать ошибку, чтобы кто-то мог посмотреть на нее и исправить проблему.
Мне удалосьвключите, отключите исключения, используя 'http_errors' => false
, чтобы мне не приходилось перехватывать несколько исключений (для кодов 4XX, 5XX и т. д.).Я также заменил вызовы $client->post()
на экземпляр new Request('POST')
, чтобы получить объект запроса при неудачном вызове API.
Теперь у меня остается следующий код:
$request = new Request('POST', 'vouchers');
$response = $this->client->send($request, ['json' => $info]);
if ($response->getStatusCode() != 201) {
$this->log->error('Voucher was not created.', [
'request' => [
'headers' => $request->getHeaders(),
'uri' => $request->getUri()->__toString(),
'method' => $request->getMethod(),
'body' => $request->getBody(),
],
'response' => [
'code' => $response->getStatusCode(),
'status' => $response->getReasonPhrase(),
'headers' => $response->getHeaders(),
'body' => $response->getBody(),
],
]);
}
Это приводит кследующая запись в журнале.
{
"request":{
"headers":[
],
"uri":"vouchers",
"method":"POST",
"body":"[object] (GuzzleHttp\\Psr7\\Stream: )"
},
"response":{
"code":404,
"status":"Not Found",
"headers":{
"Server":[
"openresty"
],
"Date":[
"Mon, 08 Oct 2018 10:28:53 GMT"
],
"Content-Type":[
"text/html;charset=UTF-8"
],
"Content-Length":[
"915"
],
"Connection":[
"keep-alive"
],
"Vary":[
"Accept-Encoding"
]
},
"body":"<body of the response>"
}
}
Это не очень полезно для меня, так как заголовки запроса отсутствуют (возможно, потому что заголовки были вставлены Guzzle , а не мной при создании экземпляраОбъект запроса).URI также не является абсолютным, и тело также непригодно для использования.
Да, я мог бы создать тело вручную, используя json_encode()
, и также разрешить URI вручную, но это привело бы к еще большему количеству несвязанного с бизнесом кода.
Можно ли зарегистрировать всю информацию о запросах и ответах с Guzzle без беспорядочного и длинного кода для простого извлечения информации из Guzzle объекты?