我计划使用 Guzzle 与现有的REST API进行通信。我想用monolog记录所有失败的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 而不是由我在实例化Request对象时插入的)。 URI也不是绝对的,主体也不可用。
是的,我可以使用json_encode()
手动创建主体,并手动解析URI,但这会导致更多与业务无关的代码。
是否可以用 Guzzle 记录整个请求和响应信息,而无需弄乱冗长的代码以仅从 Guzzle 对象中提取信息?