文件上传的REST设计 [已关闭]。

问题描述 投票:55回答:1

我想为一个文件上传服务创建一个REST API,允许用户。

  1. 打开一个会话
  2. 上传一堆文件
  3. 结束会议

而后,再回来对他们在前一个环节上传的文件进行处理。

为了方便处理每个文件的数据和处理文件本身的内容,我想使用的URI方案是这样的。

/sessions/
/sessions/3
/sessions/3/files
/sessions/3/files/5
/sessions/3/file/5/content
/sessions/3/file/5/metadata

这将允许文件元数据与文件内容分开处理。在这种情况下,只允许对文件进行GET 内容 和档案 元数据而要更新任何一个文件,都必须要有一个新的文件。

这样做有意义吗?如果不明白,为什么,如何改进?

rest file-upload api-design
1个回答
15
投票

为什么你需要会话?是为了认证和授权的原因吗?如果是,我会使用http 基本 与SSL或 消化. 因此,没有开始或结束会话,因为http是无状态的,每次请求都会发送安全头文件。

上传资源的建议是直接映射为私有文件系统。


# returns all files and subdirs of root dir
GET /{userId}/files
GET /{userId}/files/file1
GET /{userId}/files/dir1
# create or update file
PUT /{userId}/files/file2

当上传文件内容时,您将使用 多部分内容类型.

经评论后的订正答复

我会设计你想要的文件内容和有效载荷的分离,在上传有效载荷中引入链接(到文件内容)。这样可以简化资源结构。

表示 "上传 "资源。


{
  "upload-content" : "http://storage.org/2a34cafa" ,
  "metadata" : "{ .... }" 
}

资源动作:


# upload file resource
POST /files
-> HTTP 201 CREATED 
-> target location is shown by HTTP header 'Location: /files/2a34cafa

# /uploads as naming feels a bit more natural as /files
POST /sessions/{sessionId}/uploads
-> HTTP 201 CREATED
-> HTTP header: 'Location: /sessions/{sessionId}/uploads/1
-> also returning payload

# Updating upload (like metadata)
/PUT/sessions/{sessionId}/uploads/1 

© www.soinside.com 2019 - 2024. All rights reserved.