为RESTful POST api使用multipart / form-data Content Type是一个好习惯吗?

时间:2015-05-21 04:32:59

标签: json rest http restful-architecture

我有一种情况,我必须写一个api来创建一个资源,我需要接受的数据字段是一个基本上是html文件内容的字符串。正如我所看到的,我可以选择将整个事物构造为json对象,其中此字段是带有urlencoded html字符串的字符串字段,并且内容类型为multipart / form-data,其中每个字段和html字符串( UTF-8编码)是消息的一部分。
不使用json是我不满意的事情,因为我觉得违反REST标准没有构建我即将创建的实体的内容因此消费者失去了信息,因为他们无法立即看到我的信息关于提供给它的数据的api定义。但实际上multipart / form-data更好,更有效地处理html文件内容之类的东西,因为我不需要对它进行urlencode,也可以控制char编码。
在当前背景下什么是更好的方法并坚持RESTful原则?我还应该注意其他权衡吗?如何解析嵌入了巨大字符串字段(~200 Kb)的json? 编辑: - 我正在阅读有关SO的一些类似问题,其中一个突出的方法是使用元数据进行第一次调用以创建实体,然后将文件作为UPDATE进程上传的两步方法到我们使用multipart / form-data的创建实体。在这种情况下,我想,我要问的是声音是一种方法,我在单个api调用中将元数据和文件作为多部分数据发送,其中每个元数据字段实际上是多部分消息的一部分,文件也是如此

3 个答案:

答案 0 :(得分:2)

将文件上传到REST API的规范方法是使用multipart / form-data。正如W3推荐指南所说:

  

内容类型“multipart / form-data”应该用于提交   包含文件,非ASCII数据和二进制数据的表单。

Multipart / form-data比base64具有代表二进制数据的优势。坚持REST / Http理念,简化API客户端的开发。

Returning values from Forms: multipart/form-data

W3 Recommendation guide

答案 1 :(得分:1)

好的做法是每当文件与数据库字段一起上传到服务器时使用multipart / form-data。不要将base64 JSON字符串作为请求发送到您的Rest API,因为它可能会破坏文件或降低应用程序的性能。

就为消费者记录multipart / form-data Rest API而言,您必须强制API使用者使用您在Web服务中预定义的相同表单字段。

Returning Values from Forms: multipart/form-data

答案 2 :(得分:0)

我开始在客户端的每个地方使用FormData对象,代替常规表单输入字段,用于动态REST帖子。 FormData在各种教程中都是积极的,所以我选择了它。

但是,在线下,这会在将表单数据解码为Go结构时出现问题。 FormData对象作为“multipart / form-data”发送(无论发送的文件如何),我相信Go中的解码器没有将原始数据转换回字符串形式。最终我的SQL查询引起恐慌,因为十六进制数据是在字符串应该发送的地方发送的。

所以通过一些调整,我可以使用FormData,但是我决定恢复简单的通用建议:仅对发送文件时的特殊情况使用“multipart / form-data”。否则,只需使用常规的“application / x-www-form-urlencoded”。