Guzzle PSR7 请求 multipart/form-data
Guzzle PSR7 request with multipart/form-data
我在 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);
但仍然没有运气。
我错过了什么?如何更改请求以便正确发送文件?
似乎在使用 guzzle 中的 post 方法时考虑了 $options['multipart']。因此,将代码更改为 $response = $this->httpClient->post($psrRequest->getUri(), $options);
即可解决问题。
此外,重要的是不要附加 'content-type header.
我在 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);
但仍然没有运气。
我错过了什么?如何更改请求以便正确发送文件?
似乎在使用 guzzle 中的 post 方法时考虑了 $options['multipart']。因此,将代码更改为 $response = $this->httpClient->post($psrRequest->getUri(), $options);
即可解决问题。
此外,重要的是不要附加 'content-type header.