我有一个REST服务。
现在我需要具备将一些子资源从一个父级移动到另一个父级的功能,例如将一本书从一个作者移动到另一个作者。
我的变体是:
POST /api/books/x/moveto/y
但是如何以RESTful方式创建这样的架构师?
答案 0 :(得分:3)
从REST的角度来看,URL应该用于定位资源而不是表达操作。要表达操作,应使用existing HTTP verbs。
您的“移动”操作看起来就是替换该书的作者。
PUT
方法似乎是要走的路:
PUT
方法请求目标资源的状态 用表示定义的状态创建或替换 包含在请求消息有效负载中。 [...]
因此,您可以拥有如下所示的端点:
PUT /api/books/{bookId}/author
请求有效负载将包含新作者的表示。
答案 1 :(得分:1)
在这种情况下,我认为按照Cassio的答案建议更新作者是一个很好的解决方案。对于不太明显的“动作”,我使用PUT
端点。考虑将书籍存档:
PUT /api/books/{bookId}/archive
意图很明显-使用此标识符将书存档。对于更复杂的操作,请包含正文或使用查询字符串参数。例如,将一本书从一个类别移到另一个类别(假设一本书可以有0个多个类别):
PUT /api/books/{bookId}/move
{
fromCategoryId: 100,
toCategoryId: 200
}
或者:
PUT /api/books/{bookId}/move?fromCategoryId=100&toCategoryId=200
最后,IMO最能掌握的是可读性和一致性。不一定有做这种事情的“正确”方法。