【问题标题】:REST - HTTP Post Multipart with JSONREST - 带有 JSON 的 HTTP Post Multipart
【发布时间】:2012-02-23 06:18:31
【问题描述】:

我需要接收一个仅包含 2 个参数的 HTTP Post Multipart:

  • JSON 字符串
  • 二进制文件

设置body的正确方法是什么? 我将使用 Chrome REST 控制台测试 HTTP 调用,所以我想知道是否正确的解决方案是为 JSON 参数和二进制文件设置“标签”键。

在服务器端,我使用的是 Resteasy 2.x,我将像这样读取 Multipart 正文:

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

这是要走的路吗? 使用标识特定内容处置的密钥“myJsonName”检索我的 JSON 字符串是否正确? 还有其他方法可以在一个 HTTP 多部分请求中接收这 2 个内容吗?

提前致谢

【问题讨论】:

  • 这是什么类型的 REST 资源?两个部分在资源级别上有何关联?
  • 实际上我们处理这个资源的方式并不完全是RESTful,因为图像是资源的一个“组件”而不是另一个资源。

标签: java json rest http resteasy


【解决方案1】:

如果我理解正确,您想从 HTTP/REST 控制台手动编写多部分请求。多部分格式很简单;简单介绍可以找in the HTML 4.01 spec。你需要想出一个边界,它是一个在内容中找不到的字符串,比如说HereGoes。您设置请求标头Content-Type: multipart/form-data; boundary=HereGoes。那么这应该是一个有效的请求正文:

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--

【讨论】:

  • 您实际上也可以在soap-ui 中添加附件。这减少了传递实际帖子正文和内容类型的麻烦。
  • 是否有标准化的方法来提出唯一边界?
  • @andig 我不知道。也许您可以使用UUID,但这不一定是个好主意。通常,您的 HTTP 库应该会为您处理这些问题。
  • 如果我们知道请求中只有 json 和 base64 数据不应该像 \* 这样的东西作为边界工作吗? json和base64中都不允许存在。
  • 为什么使用base64编码JPEG数据? HTTP 允许您发送原始字节。
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多