将文件和关联数据发布到RESTful WebService(最好是JSON)

这可能会是一个愚蠢的问题,但我有一个晚上。 在我开发RESTful API的应用程序中,我们希望客户端以JSON形式发送数据。 部分此应用程序需要客户端上传文件(通常是图片)以及有关图片的信息。

我很难在单个请求中追踪这种情况。 是否有可能将文件数据Base6464到一个JSON字符串? 我需要执行2个职位到服务器? 我应该不使用JSON吗?

作为一个方面说明,我们在后端使用Grails,并且这些服务可以由本地移动客户端(iPhone,Android等)访问,如果有任何改变的话。


我在这里问了一个类似的问题:

如何使用REST Web服务上传包含元数据的文件?

你基本上有三个选择:

  • Base64对文件进行编码,代价是将数据大小增加大约33%。
  • 首先在multipart/form-data POST中发送文件,并将ID返回给客户端。 客户端随后使用ID发送元数据,服务器将文件和元数据重新关联。
  • 首先发送元数据,并将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

    下一篇: Passing a URL with brackets to curl