REST-使用JSON进行HTTP发布


88

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

  • JSON字符串
  • 二进制文件

设置身体的正确方法是哪一种?我将使用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个内容吗?

提前致谢


1
这是哪种REST资源?在资源级别上,两个部分如何关联?

实际上,我们处理此资源的方式并不完全是RESTful,因为映像是资源的“组件”而不是其他资源。
thermz 2012年

Answers:


148

如果我对您的理解正确,那么您想从HTTP / REST控制台手动编写一个多部分请求。分段格式很简单;简短的介绍可以在HTML 4.01规范中找到。您需要提出一个边界,即在内容中找不到的字符串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中添加附件。这减轻了必须传递实际的帖子正文和内容类型的麻烦。
Shane Lee 2014年

1
是否有一种标准化的方法来得出唯一边界?
andig 2015年

2
@andig我什么都不知道。也许您可以使用UUID,但这不一定是一个好主意。通常,您的HTTP库应该为您解决这个问题。
Vasiliy Faronov'3

如果我们知道请求中仅包含json和base64数据,是否应该像\*边界那样工作?不允许它存在于json或base64中。
DaedalusAlpha

2
为什么使用base64编码JPEG数据?HTTP允许您发送原始字节。
亚历山德拉·布林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.