假设我想编写一个界面来显示用户已阅读的书籍集。因为我希望 URI 是人类可读的,所以它们的形式是 /books/War-and-Peace
.将一本书添加到集合中似乎是一个 PUT 操作,因为它 1) 创建了一个新资源,并且 2) 是幂等的,因为集合不能有重复的元素。但是,PUT 方法要求客户端知道要创建的资源的 URI,在这种情况下必须在服务器上计算,因为可能有多本书具有相同的标题,将表示为 /books/War-and-Peace
。和 /books/War-and-Peace-2
.当然,一个 hacky 解决方案是使用 POST,它可以创建新资源,但不能保证是幂等的。
我的解决方案如下:
- 客户端 PUT 到
/book-hashes/<hash>
, 其中<hash>
是书对象的散列。 - 服务器在该 URI 和
/books/<title>
处创建对对象的引用. - 服务器发出一个指向
/books/<hash>
的303 See Other 状态码. - 客户端获取
/book-hashes/<hash>
. - 服务器响应 301 永久移动,指向
/books/<title>
. - 客户端获取
/books/<title>
并将其存储为图书资源的新 URI。 - 服务器删除
/book-hashes/<hash>
.
这是合法的 REST 解决方案吗?有没有人以不同的方式解决了这个问题?
最佳答案
这里使用 POST 没有错。 POST 通常用于“添加”东西,然后返回所创建资源的 URI。
所以
POST /books?title=War-and-Peace
303
Location: /books/War-and-Peace-2
关于http - 将无标题项添加到集合中的 RESTful 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234993/