将文件和关联数据发布到RESTful WebService(最好是JSON)
这可能会是一个愚蠢的问题,但我有一个晚上。 在我开发RESTful API的应用程序中,我们希望客户端以JSON形式发送数据。 部分此应用程序需要客户端上传文件(通常是图片)以及有关图片的信息。
我很难在单个请求中追踪这种情况。 是否有可能将文件数据Base6464到一个JSON字符串? 我需要执行2个职位到服务器? 我应该不使用JSON吗?
作为一个方面说明,我们在后端使用Grails,并且这些服务可以由本地移动客户端(iPhone,Android等)访问,如果有任何改变的话。
我在这里问了一个类似的问题:
如何使用REST Web服务上传包含元数据的文件?
你基本上有三个选择:
multipart/form-data
POST中发送文件,并将ID返回给客户端。 客户端随后使用ID发送元数据,服务器将文件和元数据重新关联。 您可以使用multipart / form-data内容类型在一个请求中发送文件和数据:
在许多应用程序中,用户可能会看到一个表单。 用户将填写表单,包括键入的信息,用户输入生成的信息或用户选择的文件中包含的信息。 填写表格后,表格中的数据将从用户发送到接收应用程序。
MultiPart / Form-Data的定义来自其中一个应用程序...
来自http://www.faqs.org/rfcs/rfc2388.html:
“multipart / form-data”包含一系列部分。 预计每个部分都包含一个内容处置标头[RFC 2183],其中处置类型为“form-data”,处置包含(名称)(附加)参数,其中该参数的值为原始字段名称的形式。 例如,一个零件可能包含一个标题:
内容处理:表单数据; 名称=“用户”
其值与“用户”字段的条目相对应。
您可以在边界之间的每个部分中包含文件信息或字段信息。 我已经成功实现了一个需要用户提交数据和表单的RESTful服务,并且multipart / form-data可以完美工作。 该服务是使用Java / Spring构建的,客户端使用的是C#,所以很遗憾,我没有任何Grails示例向您介绍如何设置服务。 在这种情况下,您不需要使用JSON,因为每个“表单数据”部分都为您提供了指定参数名称及其值的位置。
关于使用multipart / form-data的好处是您使用的是HTTP定义的头文件,因此您坚持使用现有HTTP工具创建服务的REST理念。
我知道这个线程很老,但是,我在这里错过了一个选项。 如果您想要随要上传的数据一起发送元数据(以任何格式),则可以制作一个multipart/related
请求。
多部分/相关介质类型适用于由多个相关身体部位组成的复合对象。
您可以查看RFC 2387规范以获取更详细的信息。
基本上这样的请求的每个部分都可以具有不同类型的内容,并且所有部分都以某种方式相关(例如图像和它的元数据)。 部件由边界字符串标识,最后的边界字符串后跟两个连字符。
例:
POST /upload HTTP/1.1
Host: www.hostname.com
Content-Type: multipart/related; boundary=xyz
Content-Length: [actual-content-length]
--xyz
Content-Type: application/json; charset=UTF-8
{
"name": "Sample image",
"desc": "...",
...
}
--xyz
Content-Type: image/jpeg
[image data]
[image data]
[image data]
...
--foo_bar_baz--
链接地址: http://www.djcxy.com/p/1329.html
上一篇: Posting a File and Associated Data to a RESTful WebService preferably as JSON