当前位置: 首页 > 知识库问答 >
问题:

如何使用Symfony在我的控制器中提供来自HttpClient的相同响应?

艾焱
2023-03-14

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

我决定使用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内容,响应被中断,因为它将保留响应头(content-type),但$body将不完全相同,因为HttpClient会帮我缩减内容。

问题是:有没有办法告诉HttpClient不要在我的响应体内触碰?

或者:是否有更好的方法来执行此“代理”控制器操作?

共有1个答案

谢旻
2023-03-14

我发现,如果在请求头中定义了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'=> '']);
    }

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

 类似资料:
  • 我的任务是简单地制作一个控制器,当它们准备好时立即给我结果(下面的简单示例) 我想得到字符串的确切数量(例如1000个字符串,以某种方式为1秒)(实际上我需要得到func的结果,但为了简化任务,只是字符串) 因此,当我在控制器中收到一些请求时,我希望它能以这种方式在它们准备好后尽快给出答案(无需缓冲结果): 1秒钟 “一些绳子”- 1秒钟 “另一个”- 1秒钟 “第三个”- 1000秒 “一些绳子

  • 我正在阅读Symfony通过自定义用户提供商管理用户的方法:https://symfony.com/doc/current/security/custom_provider.html 当用户提交用户名和密码时,身份验证层要求配置的用户提供程序返回给定用户名的用户对象。Symfony然后检查此用户的密码是否正确,并生成安全令牌 当我们在本地使用用户/密码连接到数据库时,这非常有效,但是我想对另一个服

  • 我试着像FOSRestBundleByExample/blob那样做。 我的行动: 不过,我有以下回应: 控制器必须返回一个响应(给定对象(FOS\RestBundle\View\View))。 我发现我可以在配置中将view\u response\u listener更改为true,但我有: 无法找到模板""。 有什么想法吗? 谢谢你,卡米尔

  • 伙计们,在我的控制器中执行rest后,我有问题从变量中获取数据。这里有一个例子来说明我的问题。 控制器 JavaScript drawDiagram.html null

  • 我试图用Spring boot 1.5.9.RELEASE来构建一个rest api,却被这个问题卡住了。对apiendpoint的post请求工作得很好,但是当到达get请求时,结果会重复。应用程序对get请求产生的响应是 关联的请求映射类代码 响应类 对如何解决这个问题有什么想法吗?预先感谢

  • 我用的是symfony4.4。7并使用HTTPClient(Symfony\Component\HTTPClient\HTTPClient)发出http请求,但探查器中未显示请求。如何使此探查器选项卡正常工作?