如何设计REST API以允许返回带有元数据的文件

时间:2014-08-01 14:17:48

标签: rest

假设我正在设计REST API,并且我需要客户端能够获取包含元数据的文件。什么是设计资源/操作的好方法?

有些想法浮现在脑海中:

  • 单个资源(即GET / files / {fileId}),它返回包含文件和带元数据的JSON / XML结构的多部分响应。我有一个觉得这不是一个很好的方法。例如,您不能使用客户端的Accept标头来确定他们是否需要XML或JSON元数据表示,因为响应类型在两种情况下都是多部分的。

  • 两个资源(即GET / files / {fileId}和GET / files / {fileId} / metadata),其中第一个返回文件本身,第二个是JSON / XML结构元数据。可以存在从元数据到文件的链接。但是,如何将文件链接与文件一起发送?

3 个答案:

答案 0 :(得分:4)

我建议使用你提出的第二个想法。这是大多数主要网络驱动器(Box,Dropbox,Google Drive等)使用的策略。它们通常具有明显不同的URL,因为它们将内容和元数据存储在不同的位置。

您可以使用指向元数据的链接向文件响应添加链接标头。链接标头在RFC 5988中描述。当前注册的链接关系集合为here。关闭袖口,似乎describedBy关系在这里是合适的。

答案 1 :(得分:3)

我使用以下API设计取得了成功。这与您建议的略有不同,主要资源只包含指向其组件的链接。

POST /file
Request
  <bytes of file>
Response
  Location: /file/17
  {
    "id": 17
  }

GET /file/17
  {
    "data": "/file/data/17",
    "metadata": "/file/metadata/17"
  }

GET /file/data/17
  <bytes of file>

GET /file/metadata/17
  {
    "type": "image",
    "format": "png"
  }

DELETE /file/17

答案 2 :(得分:0)

您的第一个选项根本不是一个好选择,因为它违反了以下REST约束。

通过这些表示来处理资源 统一接口原则。

  

当客户持有资源的表示时,包括任何资源   元数据附加,它有足够的信息来修改或删除资源。

如果你刹车的话。您的网址不会被视为RESTful。

Wiki关于它。