0

我在 Lumen(应用程序 A)中创建了一个简单的 API,它:

  • 接收 PSR-7 请求接口
  • 替换对应用程序 B 的请求的 URI
  • 并通过Guzzle发送请求。
public function apiMethod(ServerRequestInterface $psrRequest)
{
    $url = $this->getUri();

    $psrRequest = $psrRequest->withUri($url);

    $response = $this->httpClient->send($psrRequest);

    return response($response->getBody(), $response->getStatusCode(), $response->getHeaders());
}

上面的代码将查询参数、x-www-form-urlencoded 或 JSON 内容类型的数据传递给应用程序 B。但是,它无法传递 multipart/form-data。(该文件在应用程序 A: 中可用$psrRequest->getUploadedFiles())。

编辑 1

我尝试用Buzz替换 Guzzle 调用

    $psr18Client = new Browser(new Curl(new Psr17Factory()), new Psr17Factory());
    $response = $psr18Client->sendRequest($psrRequest);

但是,这并没有什么不同。

编辑 2

ServerRequestInterface 的实例表示服务器端的请求。Guzzle 和 Buzz 正在使用 RequestInterface 的实例来发送数据。RequestInterface 缺少对上传文件的抽象。所以文件应该手动添加http://docs.guzzlephp.org/en/stable/request-options.html#multipart

    $options = [];
    /** @var UploadedFileInterface $uploadedFile */
    foreach ($psrRequest->getUploadedFiles() as $uploadedFile) {
        $options['multipart'][] = [
            'name' => 'file',
            'fileName' => $uploadedFile->getClientFilename(),
            'contents' => $uploadedFile->getStream()->getContents()
        ];
    }

    $response = $this->httpClient->send($psrRequest, $options);

但仍然没有运气。

我错过了什么?如何更改请求以便正确发送文件?

4

1 回答 1

0

似乎在使用 guzzle 的 post 方法时考虑了 $options['multipart'] 。因此,将代码更改为$response = $this->httpClient->post($psrRequest->getUri(), $options);解决问题。此外,重要的是不要附加 'content-type 标头。

于 2020-08-18T09:02:51.243 回答