将子资源移动到REST中的另一个父级

时间:2016-01-28 09:13:26

标签: rest

我有一个REST服务。

现在我需要具备将一些子资源从一个父级移动到另一个父级的功能,例如将一本书从一个作者移动到另一个作者。

我的变体是:

POST /api/books/x/moveto/y

但是如何以RESTful方式创建这样的架构师?

2 个答案:

答案 0 :(得分:3)

从REST的角度来看,URL应该用于定位资源而不是表达操作。要表达操作,应使用existing HTTP verbs

您的“移动”操作看起来就是替换该书的作者。

PUT方法似乎是要走的路:

  

4.3.4. 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最能掌握的是可读性和一致性。不一定有做这种事情的“正确”方法。