我正在开发一个json rest web服务,该服务将使用使用backbone.js构建的单个网页应用程序进行消费
此API将允许消费者上传与某个实体相关的文件,例如与项目相关的pdf报告
在堆栈溢出中搜索并进行一些研究我带来了这些可能的方法:
第一种方法: base64编码数据字段
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
content: '<base64 encoded binary data>'
}
第二种方法:多部分表格帖子:
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
}
作为回复,我将获得一个报告ID,然后我将发布另一篇文章
POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
然后只发送二进制数据
(看看这个:https://stackoverflow.com/a/3938816/47633)
第三种方法:将二进制数据发布到单独的资源并保存href
首先我在客户端生成随机密钥并在那里发布二进制内容
POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
然后
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
(见:https://stackoverflow.com/a/4032079/47633)
我只是想知道我是否可以使用任何其他方法,每种方法的优点/缺点,以及是否有任何既定的方法来处理这类要求
我在第一种方法中看到的最大问题是,我必须在客户端上完全加载和base64编码文件一些有用的资源:
答案 0 :(得分:13)
我的研究结果:
单个请求(包含数据)
请求包含元数据。数据是元数据的属性并进行编码(例如:Base64)。
优点:
缺点:
例子:
单个请求(多部分)
请求包含一个或多个包含元数据和数据的部分。
内容类型:
优点:
缺点:
例子:
单个请求(HTTP标头和网址中的元数据)
请求正文包含数据和HTTP标头,URL包含元数据。
优点:
缺点:
两个请求
一个元数据请求和一个或多个数据请求。
优点:
缺点:
例子:
答案 1 :(得分:8)
我无法想到任何其他方法。
在你的3种方法中,我最常使用方法3。我看到的最大区别是第一种方法和另外两种方法:将元数据和内容分成2个资源
第一种方法似乎最直接的编码。但是,如果预计不经常使用此服务,并且您可以为用户文件上传设置合理的限制,我只会使用第一种方法。
答案 2 :(得分:5)
我认为最终的方法是3号(单独的资源),主要原因是它允许最大化我从HTTP标准获得的值,这与我对REST API的看法相匹配。例如,假设正在使用有良好基础的HTTP客户端,您将获得以下好处:
image/jpeg
或image/png
。 HTTP标头接受和内容类型为我们提供了一些优雅的语义,可以在客户端和服务器之间进行协商,而无需将其全部硬编码为模式和/或API的一部分< / LI>
另一方面,我相信如果所讨论的二进制数据不是可选的,这种方法并不是最简单的,这是公平的。在这种情况下,Eric Hu's answer中列出的缺点将发挥作用。