代码之家  ›  专栏  ›  技术社区  ›  Ben Noland

REST-DELETE真的是幂等的吗?

  •  143
  • Ben Noland  · 技术社区  · 14 年前

    删除应该是等幂的。

    如果我删除 http://example.com/account/123

    如果我再做一次,我会期望404,因为帐户不再存在?如果我试图删除一个从未存在过的帐户怎么办?

    6 回复  |  直到 14 年前
        1
  •  182
  •   Chris McCauley    14 年前

    等幂是指请求完成后系统的状态


    在所有情况下(除了错误问题-见下文),帐户不再存在。

    here

    “方法还可以具有 其中的“等幂”( 除了 错误或过期问题 N>0相同的副作用 请求。方法得到,头,放 并删除共享此属性。也, 没有副作用


    关键是 N>0个相同请求的副作用与单个请求相同。

    等幂的核心概念-您可以多次发送请求,而不必对服务器的状态进行其他更改。

        2
  •  44
  •   Bruno    14 年前

    是关于请求的效果,而不是你得到的响应代码。

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 说:

    方法还可以具有 错误或过期问题) 请求与单个请求相同 请求。

    虽然您可能会得到不同的响应代码,但是 向同一资源发送N+1个删除请求可以认为是相同的。

        3
  •  9
  •   Janac Meena    7 年前

    副作用 ,不是 -影响或反应。如果你做一个 DELETE http://example.com/account/123 结果是帐户123现在从服务器中删除。这是唯一的效果,唯一的 到服务器的状态。现在假设你也这样做 DELETE http://example.com/account/123

    这与删除请求决定以不同的方式更改服务器状态不同,因为该帐户已丢失,例如删除另一个帐户或留下错误日志。不, 您可以调用同一个删除请求一百万次,并且您可以确保服务器与第一次调用时处于相同的状态 .

        4
  •  7
  •   fumanchu    14 年前

    HTTP RFC :

    注意这是“副作用”,而不是“反应”。

        5
  •  5
  •   Franklin Yu    7 年前

    latest RFC for HTTP 1.1 (强调我的):

    由于请求可以是 如果通信失败发生在 客户端能够读取服务器的响应。例如,如果 客户端发送一个PUT请求,并且基础连接已关闭 连接并重试等幂请求。它知道重复 请求将具有相同的预期效果,即使原始的 请求成功,

    它明确表示,反应可能有所不同。更重要的是,它指出了这个概念的原因:如果一个操作是等幂的,那么当它遇到错误时,客户机可以重复这个操作,并且知道这样做不会崩溃任何东西;否则,客户机将不得不进行一个额外的查询(可能 GET )看看前一个是否有效,然后再安全地重复这个动作。只要服务器能保证,这个动作就是等幂的。引用自 another comment :

    计算等幂 discard(x) 是等幂的,但是 pop() 不是。这都是关于错误恢复的。

        6
  •  2
  •   Jason McCreary    14 年前

    我想同样的事情,404个账户是不存在的。

    你可以反驳400个错误的请求。但在休息的意义上,你要求执行一个动作的对象不存在。相当于404。