我需要重写GuzzleHTTP \ Client来记录请求和响应正文。我只能更改正在使用的客户端。我遇到的问题是这些是流,并且似乎读取内容(至少用于响应)会中断请求。
您能想到另一种通过扩展客户端来拦截请求/响应主体的方法吗?
class MyClient extends GuzzleHTTP\Client {
public function send(RequestInterface $request, array $options = []) {
// This doesn't affect original request for some reason
MyLogger::log($request->getBody()->getContents());
$response = parent::send($request, $options);
// This breaks the original request call, I think because stream is read only once
MyLogger::log($response->getBody()->getContents());
return $response;
}
}
答案 0 :(得分:0)
此处的解决方法是在读取响应内容后倒带流
MyLogger::log($response->getBody()->getContents());
$response->getBody()->rewind();
return $response
答案 1 :(得分:0)
Guzzle的中间件框架为最终用户提供了一种自然的方法,可以按照特定的标准执行特定的操作,而无需扩展NetworkStream
例如:
GuzzleHttp\Client
文档不是use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\MessageFormatter;
use GuzzleHttp\Middleware;
use Monolog\Logger;
$stack = HandlerStack::create();
$stack->push(
Middleware::log(
new Logger('Logger'),
new MessageFormatter('{req_body} - {res_body}')
)
);
$client = new Client([
'debug' => true,
'handler' => $stack,
]);
$r = $client->get('some_random_uri')->getBody();
或GuzzleHttp\Middleware::Log()
的最佳选择。 MessageFormatter