ope*_*sas 31 rest binary-data backbone.js restful-architecture
我正在开发一个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>'
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:多部分形式的帖子:
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
}
Run Code Online (Sandbox Code Playgroud)
作为回复我会得到一个报告ID,然后我会发一个帖子
POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)
然后只发送二进制数据
(看看这个:https://stackoverflow.com/a/3938816/47633)
第三种方法:将二进制数据发布到单独的资源并保存href
首先,我在客户端生成一个随机密钥,并在那里发布二进制内容
POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)
然后
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
Run Code Online (Sandbox Code Playgroud)
(见:https://stackoverflow.com/a/4032079/47633)
我只是想知道我是否可以使用任何其他方法,每种方法的优点/缺点,以及是否有任何已建立的方法来处理这种要求
我对第一种方法的看法是,我必须在客户端上完全加载和base64编码文件
一些有用的资源:
dur*_*dur 14
我的研究结果:
单一请求(包括数据)
该请求包含元数据.数据是元数据的属性并进行编码(例如:Base64).
优点:
缺点:
例子:
单一请求(多部分)
该请求包含一个或多个包含元数据和数据的部分.
内容类型:
优点:
缺点:
例子:
单个请求(HTTP标头和URL中的元数据)
请求正文包含数据和HTTP标头,URL包含元数据.
优点:
缺点:
两个请求
一个元数据请求和一个或多个数据请求.
优点:
缺点:
例子:
我无法想到任何其他方法.
在你的3种方法中,我最常使用方法3.我看到的最大区别是第一种方法和另外两种方法:将元数据和内容分成2个资源
第一种方法似乎最直接的编码.但是,如果预计不经常使用此服务,我只会使用第一种方法,您可以对用户文件上传设置合理的限制.
我认为最终的方法是3号(单独的资源),主要原因是它允许最大化我从HTTP标准获得的值,这与我对REST API的看法相匹配.例如,假设正在使用有良好基础的HTTP客户端,您将获得以下好处:
image/jpeg或image/png.HTTP标头Accept和Content-type为我们提供了一些优雅的语义,用于在客户端和服务器之间进行协商,而无需将其全部硬编码为我们的模式和/或API的一部分另一方面,我认为如果所讨论的二进制数据不是可选的,那么这种方法并不是最简单的,这是公平的.在这种情况下,Eric Hu的答案中列出的Cons 将发挥作用.
| 归档时间: |
|
| 查看次数: |
13419 次 |
| 最近记录: |