RESTful Web服务:通过组合其他资源创建新资源:提供ID或URI?

时间:2014-11-06 20:43:16

标签: api rest uri restful-url restful-architecture

当从RESTful Web服务(通过GET)获得项目集合时,每个单个项目(例如,在JSON中)的表示通常包含项目的资源标识符。这可以是资源的ID,也可以是整个URI,它通常包含ID。

如果客户端需要进一步与表示单个项目的远程资源进行交互,则需要此标识符(ID或URI)。许多人似乎认为提供整个URI而不仅仅是ID是一种好习惯,因此客户端与URI构造无关(例如,这就是Miguel Grinberg在this文章中所写的内容)。 / p>

但是,如果要组合多个项目以创建新资源,应该怎么做?然后客户端需要告诉服务器要合并哪些项目。最终,服务器需要一个用于处理请求的ID列表。假设客户端首先检索每个项目的URI - 您将在哪里执行URI解析以再次提取原始ID:在客户端或服务器中?

示例:客户端在GET请求中检索了一组页面。每个页面项都使用URI(包含ID)标识自己:

{
  "pages": [
    {
      "content": "bla bla",
      "uri": "/pages/1"
    },
    {
      "content": "that is no interesting content",
      "uri": "/pages/2"
    },
    ...
  ]
}

现在假设客户端指示服务器创建一个组合多个页面的新资源: book ,由第1页和第2页构建.POST请求正文可以包含ID或URI:

{
  "title": "A Boring Book",
  "pages": [1, 2]
}

{
  "title": "A Boring Book",
  "pages": ["/pages/1", "/pages/2"]
}

在第一种情况下,客户端需要知道URI的结构并在发送请求之前提取ID。在第二种情况下,服务器需要从URI中提取ID。

一方面,我喜欢通过URI 在客户端表示资源的想法。另一方面,我也希望保持简单实用,为什么我们应该在上下文清晰时将整个URI发送到服务器,只需要ID(书籍创建直接行动页面资源)?

您更喜欢什么?为什么?或者你认为这真的不太重要吗?

您认为以下方法是一个很好的妥协吗?客户端从URI中提取ID,方法是从右到左解析URI并在最右边的斜杠后提取数字,即假设某个URI结构而不需要对整个路径进行硬编码。

1 个答案:

答案 0 :(得分:1)

我认为客户端应该从服务器接收绝对URL,并且只使用它们而不进行任何修改。因此,我甚至会比你的最后一个例子更进一步:

{
  "title" : "A Boring Book",
  "pages" : [ "http://.../pages/1", "http://.../pages/2" ]
}

如有必要,只有服务器负责从URL中提取ID。

相关问题