【问题标题】:How do you implement resource "edit" forms in a RESTful way?您如何以 RESTful 方式实现资源“编辑”表单?
【发布时间】:2008-09-05 15:11:44
【问题描述】:

我们正在尝试为我们现在拥有的应用程序实现 REST API。我们希望使用 REST API 公开各种资源的读/写能力。我们如何实现其中的“表单”部分?我通过创建本质上用作方法调用并返回数据的 RESTful URL 来了解如何公开“读取”我们的数据:

GET /restapi/myobject?param=object-id-maybe

...并返回一个表示某种数据结构的 XML 文档。很好。

但是,通常,在 Web 应用程序中,“编辑”会涉及两个请求:一个是加载当前版本的资源并使用该数据填充表单,另一个是发回修改后的数据。

但我不明白你会如何使用 REST 映射到的 HTTP 方法做同样的事情。这是一个PUT,对吧?有人可以解释一下吗?

(额外考虑:UI 将主要使用 AJAX 完成)

-- 更新:这绝对有帮助。但是,我仍然对服务器端有点困惑?显然,我在这里不是简单地处理文件。在服务器上,响应请求的代码应该过滤请求方法以确定如何处理它?那是读写之间的“切换”吗?

【问题讨论】:

    标签: rest


    【解决方案1】:

    您可以使用许多不同的替代方案。 microformats wiki 提供了一个很好的解决方案,并且也被 RESTful JSON 工作人员引用。尽可能接近标准,真的。

     Operate on a Record
    
    GET /people/1
        return the first record 
    DELETE /people/1
        destroy the first record 
    POST /people/1?_method=DELETE
        alias for DELETE, to compensate for browser limitations 
    
    GET /people/1/edit
        return a form to edit the first record 
    PUT /people/1
        submit fields for updating the first record 
    POST /people/1?_method=PUT
        alias for PUT, to compensate for browser limitations 
    

    【讨论】:

    • 我相信 ?_method=XXX 是 Spring 的 JSP taglib 的形式。
    【解决方案2】:

    我认为您需要将数据服务与 Web UI 分开。在提供数据服务时,RESTful 系统是完全合适的,包括使用浏览器不支持的动词(如 PUT 和 DELETE)。

    在描述 UI 时,我认为大多数人会将“RESTful”与“漂亮、可预测的 URL”混淆。当您描述 Web UI 时,我不会担心纯粹的 RESTful URL 语法。

    【讨论】:

    【解决方案3】:

    如果您通过纯 HTML 提交数据,则只能使用基于 POST 的表单。 POST 请求发送到的 URI不应是正在修改的资源的 URI。您应该 POST 到每次添加新创建的资源的集合资源(在 Location 标头中带有新资源的 URI 和 202 状态代码)或 POST到更新程序资源,该资源使用请求内容(或自定义标头)中提供的 URI 更新资源。

    如果您使用的是 XmlHttpRequest 对象,则可以将方法设置为 PUT 并将数据提交到资源的 URI。如果服务器为尚不存在的资源提供有效的 URI,这也适用于空表单。第一个 PUT 将创建资源(返回 202)。如果是相同的数据,后续的 PUT 要么什么都不做,要么修改现有资源(在任何一种情况下,都会返回 200,除非发生错误)。

    【讨论】:

    • 我不同意不应向要编辑的资源发出 POST 请求。我说它应该在那里而不是其他地方制造。你在说“嘿,资源,用这些数据做点什么”。至少这样你就可以获得 50% 的语义正确,并且所涉及的代理可能会意识到他们的资源缓存可能需要更新。通过将 POST 请求发送到另一个“更新程序”资源,您会错过这一点。 POST To Collection 经常映射到 CRUD 的 create 只是由于 HTTP 没有 CREATESUBRESOURCE 方法的限制,而 POST 是 fallback,catch-all 方法。
    • POST 方法 CREATESUBRESOURCE 方法,参见w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5 —“发布的实体从属于该URI,方式与文件从属于包含它的目录,一篇新闻文章从属于发布它的新闻组,或者一条记录从属于数据库。”
    • 但现代 POST 用法不包含创建语义(不像它的 NNTP 前身,以及该方法的原始意图)。我的观点主要是关于创建一个额外的资源来处理对 URI 空间中其他地方的资源的更新。即好:POST /resource action=patch 但不好:POST /updater-script resource=/resource&action=patch
    【解决方案4】:

    加载应该只是一个普通的 GET 请求,新数据的保存应该是一个 POST 到当前有数据的 URL...

    例如,从 http://www.example.com/record/matt-s-example 加载当前数据,然后更改数据,然后 POST 回与新数据相同的 URL。

    在创建新记录时可以使用 PUT 请求(即,将数据放在当前不存在的 URL 处),但实际上仅 POST 可能是更好的开始方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2011-06-11
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多