在 RESTful 服务中处理多个资源请求

Posted

技术标签:

【中文标题】在 RESTful 服务中处理多个资源请求【英文标题】:Handling multiple resources requests in RESTful services 【发布时间】:2012-07-10 17:03:57 【问题描述】:

我对如何处理传递多个资源的请求感到困惑。

我有以下层次结构。项目有可交付成果,可交付成果有文档。所以项目->可交付成果->文档。

对于特定于文档的自定义操作,比如说 change_status,我有诸如 /projects/1/deliverables/1/documents/1/change_status 之类的路由。至此一切顺利。

但是,当我想在多个文档上更改状态时,最佳做法是什么? /projects/1/deliverables/1/documents/change_status(传递一组文档ID)似乎不是RESTFul,因为我的理解是在“文档”之后应该存在特定的ID。

/projects/1/deliverables/1/change_status(传递一组文档ID)并不能说服我有两个原因。首先,将调用我的可交付成果控制器(按照 Rails 中的约定),而且您似乎正在更改可交付成果而不是文档的状态。鉴于可以在文档中更改状态,我认为生成的 url 令人困惑,特别是如果您也可以将状态更改为可交付成果(您如何区分将状态更改为可交付成果或文档,在这种情况下 url 将是相同的) .

所以基本上我对如何处理在 RESTFul 中处理多个资源的请求感到困惑。非常感谢任何帮助/澄清!谢谢各位!

【问题讨论】:

【参考方案1】:

基本的 RESTful URL 约定绝对不是要在所有情况下都虔诚地应用,当您超出标准 CRUD 场景时,您需要做出最佳判断。

如果您打算始终更改可交付成果中文档的状态,那么我会选择(如您建议的那样):/projects/1/deliverables/1/documents/change_status

如果您计划跨可交付成果和项目更改文档的状态,那么我会使用单独的路径直接访问文档,例如:/documents/change_status

无论哪种方式,您都需要传递一个 document_id 参数数组。

【讨论】:

【参考方案2】:

另外,您应该只在 URL 中调用 status 子资源“status”,而不是 change_status。

PATCH /documents/status HTTP/1.1

approved=true&id=7&id=12

【讨论】:

嗯,它是 change_)status 因为它是一个动作而不是资源。在我的应用程序中没有状态这样的东西,但您可以更改文档的状态属性。我想,因为它代表一个动作(这是一个将使用其他客户端的 API),所以我将动词添加到它。我错了吗? 是的,我认为你错了。资源的属性资源,只是一个更小的资源。 “状态”是一个东西(名词)吗?你能想象得到它(找出它有什么价值)吗?对于我能想到的这个词的所有用法,我会说是的。在 RESTful API 中,URI 只代表名词,HTTP 方法代表动词。使用 POST、PUT 或 PATCH 通过将请求发送到 /document/123(状态未单独公开)或 /document/123/status(单独公开)来更改状态的值。两者都是很好的做法。

以上是关于在 RESTful 服务中处理多个资源请求的主要内容,如果未能解决你的问题,请参考以下文章

restful 规范

如何响应 RESTful Web 服务中的备用 URI

Restful架构特点

处理多个动作的 RESTful CRUD 函数?

带有批处理请求的 RESTful API

Restful风格接口书写规范