将无标题项添加到集合的RESTful方法是什么?

时间:2011-06-04 05:39:14

标签: http rest

说我想写一个界面,公开用户已读过的一套书。由于我希望URI是人类可读的,因此它们的格式为/books/War-and-Peace。将一本书添加到集合似乎是一个PUT操作,因为它1)创建一个新资源,2)是幂等的,因为一个集合不能有重复的元素。但是,PUT方法要求客户端知道要创建的资源的URI,在这种情况下必须在服务器上计算,因为可能有多个具有相同标题的书籍,这些书籍将表示为{{1} }和/books/War-and-Peace。当然,一个hacky解决方案是使用POST,允许创建新资源,但不保证是幂等的。

我的解决方案如下:

  1. 客户端PUT为/books/War-and-Peace-2,其中/book-hashes/<hash>是图书对象的哈希值。
  2. 服务器在该URI和<hash>
  3. 处创建对该对象的引用
  4. 服务器发出303请参阅指向/books/<title>的其他状态代码。
  5. 客户GET /books/<hash>
  6. 服务器响应301 Moved Permanently,指向/book-hashes/<hash>
  7. 客户端获取/books/<title>并将其存储为图书资源​​的新URI。
  8. 服务器删除/books/<title>
  9. 这是一个合法的REST解决方案吗?有没有人以不同的方式解决问题?

2 个答案:

答案 0 :(得分:3)

在这里使用POST没有任何问题。 POST通常用于“添加”事物,然后返回所创建资源的URI。

所以

POST /books?title=War-and-Peace

303 
Location: /books/War-and-Peace-2

答案 1 :(得分:0)

怎么样?

GET /BookSlug?title=War%20and%20Peace
=>
200 OK
Content-Type: text/plain

war-and-peace

接着是

PUT /Book/war-and-peace
<BookContent>
=>
201 Created