1

我有一个控制器,它必须将接收到的请求(更改一些查询参数)转发到另一台服务器,并返回它的响应(具有相同的标头、状态和正文)。

我决定使用 HttpClient 来做到这一点。

问题是 HttpClient 转换了内容(即:放气 gzip 请求),它破坏了输出响应。

这是示例的一部分:

        $response = $client->request($request->getMethod(), $extUrl, [
            'headers' => $reqHeaders,
            'timeout' => 45,
            'verify_host' => false,
            'verify_peer' => false,
            'body' => $request->getContent(),
        ]);

        #response data
        $body = $response->getContent(false);
        $statusCode = $response->getStatusCode();
        $headers = $response->getHeaders(false);

        return new Response($body, $statusCode, $headers);

考虑到第二个服务器返回一个 gzip 压缩的内容,响应被破坏了,因为它会保留响应头(内容类型)但 $body 不会完全相同,因为 HttpClient 帮我缩小内容的好处。

问题是:有没有办法告诉 HttpClient 不要触摸我的响应正文?

或者:有没有更好的方法来制作这个“代理”控制器动作?

4

1 回答 1

1

我发现如果accept-encoding在请求标头中定义,它不会被 CurlResponse 类夸大......

    #\Symfony\Component\HttpClient\Response\ResponseTrait::$inflate
    $this->inflate = !isset($options['normalized_headers']['accept-encoding']);

    #\Symfony\Component\HttpClient\Response\response
    $response->inflate = \extension_loaded('zlib') && $response->inflate && 'gzip' === ($response->headers['content-encoding'][0] ?? null) ? inflate_init(ZLIB_ENCODING_GZIP) : null;

因此,我为这些情况指定了一些空编码。

    if (empty($request->headers->get('accept-encoding'))) {
        //adding some accept-encoding will make httpclient response not to deflate the response (gzdecode) automatically
        $request->headers->add(['accept-encoding'=> '']);
    }

我仍然不知道这是否是转发请求及其在控制器中的响应的最佳方法,但上述解决方案解决了我的问题。

于 2020-06-24T04:46:27.287 回答