首页 文章

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

提问于
浏览
54

我需要为文件上传服务创建一个REST API,允许用户:

  • 打开一个会话

  • 上传一堆文件

  • 关闭会话

然后,回过头来处理他们在之前会话中上传的文件 .

为了便于处理有关每个文件的数据和处理文件本身的内容,这是我正在考虑使用的URI方案:

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

这将允许文件元数据与文件内容分开处理 . 在这种情况下,文件内容和文件元数据只允许GET,并且要更新任何一个,新文件必须是PUT .

这有意义吗?如果没有,为什么以及如何更好?

1 回答

  • 15

    你为什么需要课程?它是出于身份验证和授权的原因吗?如果是这样,我会使用http basic与SSL或digest . 因此,没有开始或结束会话,因为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
    

    上传文件内容时,您将使用multipart content type .

    评论后修改了答案

    我会通过在上传有效负载内引入链接(到文件内容)来设计您想要的文件内容和有效负载分离 . 它简化了资源结构 .

    表示'上传'资源:

    {
      "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
    

相关问题