将Slim HTTP请求转发到Guzzle客户端

时间:2019-05-09 15:07:55

标签: php http curl slim guzzle

我在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。

如何最好地做到这一点?

1 个答案:

答案 0 :(得分:0)

PSR-7请求对象是IMMUTABLE。也就是说,您不能更改值。设置新内容将返回一个新实例

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

所以,只需更改

 trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));

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

此外,$slimRequest = $slimRequest->withUri($slimRequest->getUri()->withHost('https://example.com')); 也返回一个Request对象。您需要的是:

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

这将为您提供字符串。