拦截GuzzleHTTP请求和响应主体

时间:2020-06-03 01:55:47

标签: php guzzle

我需要重写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;
  }

}

2 个答案:

答案 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

中提供了完整的选项列表