当从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结构而不需要对整个路径进行硬编码。
答案 0 :(得分:1)
我认为客户端应该从服务器接收绝对URL,并且只使用它们而不进行任何修改。因此,我甚至会比你的最后一个例子更进一步:
{
"title" : "A Boring Book",
"pages" : [ "http://.../pages/1", "http://.../pages/2" ]
}
如有必要,只有服务器负责从URL中提取ID。