在单个 HTTP POST 请求中同时传递文件资源和 json 正文

Posted

技术标签:

【中文标题】在单个 HTTP POST 请求中同时传递文件资源和 json 正文【英文标题】:Passing both a file resource and a json body in a single HTTP POST request 【发布时间】:2020-02-28 20:23:32 【问题描述】:

我正在构建一个 REST API,并且我有一个端点,我需要在其中传递文件资源和 JSON 正文。显然我做不到:

You can only select one HTTP request method! You asked for both POST.

在 cURL 请求中我同时提供表单字段和这样的正文时出现此错误:

curl -X POST "http://127.0.0.1/path" -F "resource=@img.jpg" -d "@requestBody.json"

如果我想让它工作,我需要将我的请求正文作为表单字段本身传递:

curl -X POST "http://127.0.0.1/path" -F "resource=@img.jpg" -F "myRequestBody=@requestBody.json;type=application/json"

问题是,为了获取此内容,我需要使用 file_get_contents() 函数,然后还对内容进行 json 解码。这不是一个很好的解决方案,而且似乎有点慢。有更清洁的方法吗?

【问题讨论】:

上传文件时,内容类型不应该是multipart/form-data吗? 我认为cURL在检测到-F参数时会自动添加它 不确定当你明确提到type=application/json时它是否会覆盖类型。 【参考方案1】:

根据文件的大小,您可以对数据进行 base64 编码并将其包含在 JSON 有效负载中。

否则,您将需要使用Content-Type: multipart/form-data

【讨论】:

以上是关于在单个 HTTP POST 请求中同时传递文件资源和 json 正文的主要内容,如果未能解决你的问题,请参考以下文章

Python Http 请求

从http请求中 获得请求参数 应该调用哪个方法

HTTP中get请求与post请求区别

如何将图像文件传递到 Flutter 中的 Http 请求(POST)正文?

Python----面试题

HTTP学习记录:请求方法