当前位置: 首页 > 知识库问答 >
问题:

使用多部分/表单数据吞噬 PSR7 请求

麻昌翰
2023-03-14

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

  • 接收PSR-7请求接口
  • 替换对应用程序B的请求的URI
  • 并通过古斯发送请求。
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());
}

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

编辑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);

但是仍然没有运气。

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


共有1个答案

华善
2023-03-14

在使用guzzle的post方法时,似乎考虑了$选项['multipart']。所以将代码更改为美元响应=$this-

 类似资料:
  • 问题内容: 我正在编写一个RESTful API。我在使用不同的动词上载图像时遇到麻烦。 考虑: 我有一个对象,可以通过对URL的发布/放置/删除/获取请求来创建/修改/删除/查看。如果有要上载的文件,则请求是多部分形式;如果只有文本要处理,则请求是application / xml。 为了处理与对象相关的图像上传,我正在做类似的事情: 这里的主要问题是在尝试处理放置请求时,显然$ _POST不包

  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 我正在尝试通过使用多部分数据主体的JMeter构建HTTP请求。 我有一个HTTP头管理器,其内容类型设置为多部分/表单数据;边界=AaB03x。我选择了“将多部分/表单数据用于POST”。 然后我创建了一个数据主体, 当我运行这个程序时,我发现请求没有正确地发送正文,而是发送了一些随机数据, 发布数据: 并给出错误响应, 我的第二个问题是:请求的第3部分发送一个要上载的文件。我可以通过某种方式传

  • 我是Java(Spring Boot)新手,我正在尝试向s3发送一个

  • 问题内容: 在Apache Commons HttpClient的3.x版本中,可以进行multipart / form-data POST请求(2004年的示例)。不幸的是,这在HttpClient的4.0版本中不再可能。 对于我们的核心活动“ HTTP”,多部分内容超出了范围。我们很乐意使用由其他项目维护的多部分代码,但我对此一无所知。几年前,我们曾尝试将多部分代码移至commons编解码器,

  • 如何使用ajax或XMLHttpRequest从javascript调用RESTAPI,以使用内容类型:multipart/form data上载文件。 文件内容是二进制格式的,但我调用的API具有以下请求格式:Authorization:Bearer 我使用以下代码段上传文件内容: 其中formData是二进制格式的文件内容。请建议这是正确的方法还是应该以不同的方式处理。我使用的文件类型是IFC