Guzzle “代理”;“多部分”;请求结果为空正文

Guzzle “代理”;“多部分”;请求结果为空正文,guzzle,zend-framework3,laminas-http,Guzzle,Zend Framework3,Laminas Http,我们的团队最近迁移到了Laminas,在这样做的过程中,我们的应用程序如何处理文件上传遇到了一个问题。我们有两个应用程序(都是MVC):一个视图应用程序和一个API应用程序。我们的view应用程序处理来自浏览器的所有请求,并通过ApiProxyController代理API请求。这适用于除文件上载之外的所有请求。对于那些请求(multipart/formdata;),我们已经看到,当请求到达API应用程序时,请求的主体是空的 我们在使用最新版本的Guzzle HTTP客户端和Laminas客户端

我们的团队最近迁移到了Laminas,在这样做的过程中,我们的应用程序如何处理文件上传遇到了一个问题。我们有两个应用程序(都是MVC):一个视图应用程序和一个API应用程序。我们的view应用程序处理来自浏览器的所有请求,并通过ApiProxyController代理API请求。这适用于除文件上载之外的所有请求。对于那些请求(
multipart/formdata;
),我们已经看到,当请求到达API应用程序时,请求的主体是空的

我们在使用最新版本的Guzzle HTTP客户端和Laminas客户端时都遇到过这个问题。下面是我们用来从视图应用程序代理请求的代码片段:

/* @var $request \Laminas\Http\PhpEnvironment\Request */
$request = $this->getRequest();
// URI object used to build PSR-7 request; update URI for proper forwarding

$uri = $request->getUri();
$uri->setHost($this->apiHost);

$psr7Request = Psr7ServerRequest::fromLaminas($request)
    ->withoutHeader('Host')
    ->withHeader('Authorization', sprintf('Bearer %s', $identity->getAccessToken()->getToken()));

$guzzle = new \GuzzleHttp\Client([
    // Turn off SSL certificate verification
    'verify' => false,
    // Prevent exceptions from being thrown due to HTTP status codes (e.g. 4xx, 5xx)
    'exceptions' => false,
]);

$psr7Response = $guzzle->send($psr7Request);
$response = Psr7Response::toLaminas($psr7Response);

我在拉雷维尔也遇到过类似的麻烦。您需要从原始请求中删除内容类型头,因为它包含边界。
然后,您应该修改发送正文的请求,以自动生成新的内容类型和内容长度标题。

我应该补充一点,
$psr7Request
正确地显示“parseBody”和“uploadedFiles”中的数据。但是,这两个问题都没有发送到API。使用本文中专门的代码对建议进行实际应用,将使提出问题的用户以及将来查看文章的用户的答案更有价值。