【问题标题】:Forwarding Slim HTTP requests to Guzzle client将 Slim HTTP 请求转发到 Guzzle 客户端
【发布时间】:2019-09-27 11:15:39
【问题描述】:

我在 REST API 服务器上使用 Slim。一些端点需要盲目地代理到另一台服务器,我在这部分使用 Guzzle。大多数情况下,它只使用 Slim 请求作为 Guzzle 请求(进行一些小的修改,例如主机等)。

<?php
use Psr\Http\Message\ServerRequestInterface as SlimRequest;
use Psr\Http\Message\ResponseInterface as SlimResponse;
use GuzzleHttp\Psr7\Request as GuzzleRequest;
use GuzzleHttp\Psr7\Response as GuzzleRequest;

$app->post('/bla/bla/bla', function (SlimRequest $slimRequest, SlimResponse $slimResponse) {
    $slimRequest = $slimRequest->withUri($slimRequest->getUri()->withHost('https://example.com'));
    $guzzleResponse=$this->httpClient->send($slimRequest);
});

我的一个端点使用多部分内容,并且正在发送文件和 POST 内容。作为替代方案,我尝试了以下但没有成功。

<?php
use Psr\Http\Message\ServerRequestInterface as SlimRequest;
use Psr\Http\Message\ResponseInterface as SlimResponse;
use GuzzleHttp\Psr7\Request as GuzzleRequest;
use GuzzleHttp\Psr7\Response as GuzzleRequest;

$app->post('/bla/bla/bla', function (SlimRequest $slimRequest, SlimResponse $slimResponse) {
    $headers = array_intersect_key($slimRequest->getHeaders(), array_flip(["HTTP_CONNECTION", "CONTENT_LENGTH", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "CONTENT_TYPE"]));
    $guzzleRequest = new \GuzzleHttp\Psr7\Request($slimRequest->getMethod(), $slimRequest->getUri()->getPath(), $headers, $slimRequest->getBody());
    $guzzleResponse=$this->httpClient->send($guzzleRequest);
});

如有必要,我将求助于手动创建 multipart form,但是,我希望有更好的方法来做到这一点,因为两者都兼容 PSR-7。

这应该如何最好地完成?

【问题讨论】:

    标签: php http curl slim guzzle


    【解决方案1】:

    PSR-7 请求对象是不可变的。也就是说,您不能更改这些值。设置新的东西会返回一个新实例。

    https://www.php-fig.org/psr/psr-7/

    所以,换个方式

    $slimRequest->withUri($slimRequest->getUri()->withHost('https://example.com'));
    

    到

    $slimRequest = $slimRequest->withUri($slimRequest->getUri()->withHost('https://example.com'));
    

    另外,$slimRequest-&gt;getUri()-&gt;withHost('https://example.com') 也返回一个 Request 对象。你需要的是:

    $slimRequest-&gt;getUri()-&gt;withHost('https://example.com')-&gt;getHost()

    这会给你你的字符串。

    【讨论】:

    • 好点。实际上是这样做的,但是,并没有显示在我的示例脚本中。对多部分表单没有帮助。
    • 您的意思是添加$slimRequest = ?就这么做了。
    • 好的,但括号中的内容是另一个请求,而不是字符串 URL,因此您需要对下一位进行排序
    • 即。 withHost() 返回另一个请求对象
    • 尝试将括号中的位更改为$slimRequest-&gt;getUri()-&gt;withHost('https://example.com')-&gt;getHost()
    猜你喜欢
    • 2018-10-30
    • 2016-03-21
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多