【问题标题】:Which HTTP methods match up to which CRUD methods?哪些 HTTP 方法与哪些 CRUD 方法匹配?
【发布时间】:2011-09-06 09:21:26
【问题描述】:

在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。 GET/Read 和 DELETE/Delete 很明显。

但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?

【问题讨论】:

    标签: http rest crud http-method


    【解决方案1】:

    目前(2016 年)最新的 HTTP 动词是 GET、POST、PATCH、PUT 和 DELETE

    概览

    • HTTP GET - 选择/请求
    • HTTP PUT - 更新
    • HTTP POST - 插入/创建
    • HTTP PATCH - 当PUT完整的资源表示很麻烦并且占用更多带宽时,例如:当您必须更新部分列时
    • HTTP 删除 - 删除

    希望这会有所帮助!

    如果您对设计 REST API 感兴趣,这是一本值得阅读的经典读物! website online versiongithub repository

    【讨论】:

    • 截至 2018 年 2 月,请注意 PATCH 尚未在客户端和服务器库中彻底实现。
    • 哦,好的,谢谢,我明白了...您介意发布链接/参考,以便我看看吗?
    【解决方案2】:
    Create = PUT with a new URI
             POST to a base URI returning a newly created URI
    Read   = GET
    Update = PUT with an existing URI
    Delete = DELETE
    

    PUT 可以映射到 Create 和 Update,这取决于与 PUT 一起使用的 URI 的存在。

    POST 映射到 Create。

    更正:POST 也可以映射到 Update,尽管它通常用于 Create。 POST 也可以是部分更新,因此我们不需要建议的 PATCH 方法。

    【讨论】:

    • +1:您在 PUT 创建其名称 (URI) 由客户端分配的资源和 POST 创建其名称由服务器分配的资源之间的区别很重要。有关它的讨论,请参阅 Richardson 和 Ruby 的 Restful Web Services (O'Reilly)。
    • 由于 Web 浏览器尚不支持 PUT 和 DELETE,因此可以通过在 POST 的 URI 上添加类似 method=PUT 或 method=DELETE 的查询字符串参数来“重载 POST”。
    • @JimFerrans PUT 和 DELETE 由 Web 浏览器很好地支持,使用 XHR。但是,在 HTML 表单的上下文中,HTML 规范不支持它们,因此浏览器也不支持。
    • 虽然没有规范地映射到 CRUD 中的字母,但许多 REST 框架也使用 GET /entity/ 来列出类型为 entity 的实体。 GET /entity/id 将读取与 id 匹配的特定实体。
    【解决方案3】:

    我正在寻找相同的答案,这就是 IBM 所说的。 IBM Link

    POST            Creates a new resource.
    GET             Retrieves a resource.
    PUT             Updates an existing resource.
    DELETE          Deletes a resource.
    

    【讨论】:

      【解决方案4】:

      stormpath 有一个很棒的 youtube 视频谈话,实际上解释了这一点,URL 应该跳到视频的正确部分:

      stormpath youtube video

      另外值得一看的是,它有一个多小时的谈话,但如果您考虑花时间构建 REST api,这将非常有趣。

      【讨论】:

        【解决方案5】:

        整个关键在于您是否在进行 幂等 更改。也就是说,如果对消息采取两次行动将导致“相同”的事情出现,就好像它只做了一次一样,那么你就有了一个幂等的变化,它应该被映射到 PUT。如果不是,它映射到 POST。如果您从不允许客户端合成 URL,则 PUT 非常接近于 Update,而 POST 可以很好地处理 Create,但这肯定不是唯一的方法;如果客户端知道它想要创建/foo/abc 并且知道要放什么内容,它就可以作为 PUT 工作。

        POST 的规范描述是当您承诺购买某物时:这是一个没有人愿意在不知情的情况下重复的动作。相比之下,预先设置订单的派送地址可以用 PUT 来完成:不管你被告知发送到6 Anywhere Dr, Nowhereville 一次、两次还是一百次:它仍然是同一个地址。这是否意味着它是一个更新?可能是……这完全取决于您要如何编写后端。 (请注意,结果可能不相同:您可以向用户报告他们上次执行 PUT 时作为资源表示的一部分,这将确保重复的 PUT 不会导致相同的结果,但结果仍然会在功能意义上是“相同的”。)

        【讨论】:

        • POSTPUT 的用例之间的这种区别是一个有趣的区别,应该回答“哪个是'创建',哪个是'更新'?”清楚得多。此外,关于 API 的实现,重复的 PUT 应该相当于静默无操作,而重复的 POST 可能会抛出异常,如果发送的数据的某些方面应该在支持应用程序的数据存储中保持唯一性。
        • 这个答案和以下评论提出了一个重要的观点,即 caution 应该在将 CRUD 等同于 (1to1) 与 HTTP REST 语义密切相关时进行。这不是规范映射。
        【解决方案6】:

        REST 的构建块主要是资源(和 URI)和超媒体。在这种情况下,GET 是获取资源表示的方式(在 CRUD 术语中确实可以映射到 SELECT)。

        但是,您不必期望 CRUD 操作和 HTTP 动词之间存在一对一的映射。 PUTPOST 之间的主要区别在于它们的幂等性。 POST 也更常用于部分更新,因为 PUT 通常意味着发送资源的全新表示。

        我建议阅读以下内容:

        HTTP specification 也是一个有用的参考:

        PUT 方法要求 封闭实体存储在 提供的请求 URI。

        [...]

        两者的根本区别 POST 和 PUT 请求反映在 的不同含义 请求-URI。 POST 请求中的 URI 标识将要使用的资源 处理封闭的实体。那 资源可能是接受数据的 进程,通往其他人的门户 协议或单独的实体 接受注释。相比之下, PUT 请求中的 URI 标识 请求中包含的实体—— 用户代理知道 URI 是什么 预期和服务器不得 尝试将请求应用于某些 其他资源。如果服务器愿意 该请求适用于 不同的URI,

        【讨论】:

          【解决方案7】:

          这取决于具体情况..但总的来说:

          PUT = 使用资源的具体 URI 更新或更改具体资源。

          POST = 在给定 URI 的源创建一个新资源。

          编辑博文:

          放置: /blog/entry/1

          创建一个新的:

          发布: /博客/条目

          在某些情况下,新资源的 URI 在请求之前是明确的,PUT 可能会创建新资源。 POST 也可以用于实现其他几个用例(GET、PUT、DELETE、HEAD、OPTIONS)没有涵盖的其他用例

          对于 CRUD 系统的一般理解是 GET = 请求,POST = 创建,Put = 更新,DELETE = 删除

          【讨论】:

            【解决方案8】:

            Symfony 项目试图将其 HTTP 方法与 CRUD 方法结合起来,their list 将它们关联如下:

            • GET 从服务器检索资源
            • POST 在服务器上创建资源
            • PUT 更新服务器上的资源
            • DELETE 从服务器中删除资源

            值得注意的是,正如他们在该页面上所说,“实际上,许多现代浏览器不支持 PUT 和 DELETE 方法。”

            据我所知,Symfony 在生成表单时为那些不支持它们的浏览器“伪造” PUT 和 DELETE,以便尝试尽可能接近使用理论上正确的 HTTP 方法,即使浏览器不支持不支持。

            【讨论】:

              【解决方案9】:

              一般来说,这是我使用的模式:

              • HTTP GET - 选择/请求
              • HTTP PUT - 更新
              • HTTP POST - 插入/创建
              • HTTP 删除 - 删除

              【讨论】:

              • PUT 和 POST 与 Update 或 Create 都不完全匹配; PUT 是“设置”(即,您事先知道资源名称并给出要使用的值),而 POST 是其他一切。关键是要考虑你所做的是否是幂等
              • 评论+1。两者之间的绝对映射的假设可能会产生误导。例如,对某个 URI 的 HTTP DELETE 操作可能会简单地修改(即更新)服务器端记录,以便 HTTP GET 操作不再返回表示。
              • PUT 和 POST 与 Update 或 Create 都不完全匹配。没错,但 AJ 描述了 he 使用的模式。
              猜你喜欢
              • 2021-03-16
              • 2013-04-26
              • 1970-01-01
              • 2011-02-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-11
              • 1970-01-01
              相关资源
              最近更新 更多