【问题标题】:Handling multiple resources requests in RESTful services在 RESTful 服务中处理多个资源请求
【发布时间】: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 中处理多个资源的请求感到困惑。非常感谢任何帮助/澄清!谢谢各位!

【问题讨论】:

    标签: ruby-on-rails rest restful-url restful-architecture


    【解决方案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(单独公开)来更改状态的值。两者都是很好的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多