symfony - 如何使用 Symfony 在我的控制器中提供来自 HttpClient 的相同响应?
问题描述
我有一个控制器,它必须将接收到的请求(更改一些查询参数)转发到另一台服务器,并返回它的响应(具有相同的标头、状态和正文)。
我决定使用 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 不要触摸我的响应正文?
或者:有没有更好的方法来制作这个“代理”控制器动作?
解决方案
我发现如果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'=> '']);
}
我仍然不知道这是否是转发请求及其在控制器中的响应的最佳方法,但上述解决方案解决了我的问题。
推荐阅读
- vue.js - 如何在 VueJS 中将完全编译的组件动态附加到 DOM
- jenkins - 将工件从一个 jenkins101 复制到另一个 jenkins102
- python - 将 HEX 字符串转换为 int
- react-native - 如何在本机反应中一次请求多个权限
- c# - 在 ASP.NET Core 中,如何使用 sqlite
- c++ - [[gnu::pure]] 函数属性和线程的优化问题
- arrays - Modelica:在二维数组中添加行和列
- javascript - amcharts 4世界地图工具提示中的交互式内容,不起作用
- qt - QML 添加两个输入并返回结果
- php - 在服务器上为多个用户运行 MySql