在RESTful POST api中使用multipart/form-data内容类型是一个好的实践吗?

3
我有一个情况,需要编写一个API来创建资源,其中我需要接受一个字符串,该字符串基本上是HTML文件的内容。我认为我可以选择将整个内容结构化为JSON对象,其中该字段是一个带有URLEncoded HTML字符串的字符串字段,并且Content Type为multipart/form-data,其中每个字段和HTML字符串(UTF-8编码)都是消息中的一部分。不使用JSON让我感到不舒服,因为我感觉违反了REST标准,没有对我即将创建的实体的内容进行结构化,因此消费者会失去信息,因为他们无法立即查看我的API定义以确定要向其提供什么数据。但实际上,multipart/form-data处理HTML文件内容更好,更有效,因为我不必进行URLEncode并且可以控制字符编码。在当前情况下,哪种方法更好并维护RESTful原则?还有其他权衡需要注意吗?解析具有巨大字符串字段(〜200KB)嵌入式的JSON如何处理?编辑:-我在SO上阅读了一些类似的问题,其中一个突出的方法是采用两步方法,首先使用元数据进行第一次调用以创建实体,然后将文件作为UPDATE过程上传到已创建的实体中,在这种情况下,我想问的是,在单个API调用中发送元数据和文件作为多部分数据的做法有多可靠,其中每个元数据字段实际上是多部分消息中的一部分,就像文件一样。
3个回答

4
上传文件到REST API的规范方式是使用multipart/form-data。正如W3推荐指南所说:
“应该使用内容类型为multipart/form-data的方式提交包含文件、非ASCII数据和二进制数据的表单。”
与使用base64表示二进制数据相比,multipart/form-data具有优势。它遵循REST/Http哲学,并简化了API客户端的开发。
“从表单返回值:multipart/form-data”和“W3推荐指南”可参考https://www.ietf.org/rfc/rfc2388.txthttp://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

那是不正确的,那是使用HTML表单上传文件的规范方式。它并没有说明在REST API中如何使用它。 - Prakhar Londhe

1
使用multipart/form-data是上传文件到服务器时的良好实践。不要将base64 JSON字符串作为请求发送到Rest API,因为它可能会损坏文件或降低应用程序的性能。
就记录multipart/form-data Rest API以供消费者使用而言,您必须强制API消费者使用您在Web服务中预定义的相同表单字段。 从表单返回值:multipart/form-data

1
我开始在客户端使用FormData对象,代替常规的表单输入字段,用于动态REST提交。各种教程都对FormData给出了正面评价,所以我选择了它。
然而,后来在将表单数据解码到我的Go结构体时,这导致了问题。无论是否发送文件,FormData对象都以“multipart/form-data”形式发送,我认为我的Go解码器没有将原始数据转换回字符串形式。最终,我的SQL查询引发了恐慌,因为应该是字符串的地方出现了十六进制数据。
因此,在进行一些调整后,我可以使用FormData,但我决定回归简单的通用建议:仅在发送文件等特殊情况下使用“multipart/form-data”。否则,只需使用常规的“application/x-www-form-urlencoded”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接