【问题标题】:Why not use PUT for REST queries that require a payload?为什么不将 PUT 用于需要有效负载的 REST 查询?
【发布时间】:2015-10-19 16:53:30
【问题描述】:

REST 建议查询(不是资源创建)通过 GET 方法完成。在某些情况下,查询数据太大或结构难以放入 URL,为了解决这个问题,修改了 RESTful API 以支持带有正文的查询。

似乎需要正文的 RESTful 查询的约定是使用 POST。以下是几个例子:

查询不会修改系统的内部状态,但 POST 不支持幂等操作。但是,PUT 是幂等的。对于需要正文的查询,为什么 RESTful API 不使用带有正文的 PUT 而不是 POST?

注意:A popular question 询问创建资源时首选哪个(PUT 与 POST)。这个问题询问为什么 PUT 不用于需要正文的查询。

【问题讨论】:

  • 我对这个问题感到困惑。您是在询问 GET 与 PUT 还是 PUT 与 POST?第一句话说的是前者,但最后一段建议后者。
  • 该问题询问关于 PUT 与 POST 的 查询 与正文。你不能用 body 做 GET(或者至少它没有被广泛支持),所以在主要/常见的 HTTP 动词中选择 PUT 或 POST,忽略 REPORT 和其他动词。

标签: rest


【解决方案1】:

没有。 PUT 可能是幂等的,但它也有特定的含义。 PUT 中的请求正文应用于替换 URI 中的资源。

POST 没有这样的假设。请注意,使用POST 请求意味着该请求可能不是是幂等的,在特定情况下它仍然可能是。

但是,您可以使用 PUT 来完成此操作,但这需要您跳过一个额外的环节。基本上,您可以创建使用PUT 的“查询资源”,然后立即使用GET 来获取此查询资源的结果。也许这就是您所追求的,但这是最 RESTful 的,因为生成的查询结果仍然可以链接到。 (如果您使用 POST 请求,则完全丢失的东西)。

【讨论】:

    【解决方案2】:

    您应该阅读标准:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

    POST的定义:

    POST 方法用于请求源服务器接受 包含在请求中的实体作为资源的新下属 由 Request-Line 中的 Request-URI 标识。

    POST 方法执行的操作可能不会产生资源 可以通过 URI 标识。在这种情况下,200(OK)或 204 (No Content) 是适当的响应状态,取决于是否 响应中是否包含描述结果的实体。

    PUT的定义

    PUT 方法请求将封闭的实体存储在 提供的请求 URI。如果 Request-URI 引用了一个已经存在的 资源,封闭的实体应该被认为是修改过的 驻留在源服务器上的版本。如果请求 URI 不指向现有资源,并且该 URI 能够 被请求用户代理定义为新资源, 源服务器可以使用该 URI 创建资源。

    如果无法使用 Request-URI 创建或修改资源,则应给出反映问题性质的适当错误响应。

    另一件事是 PUT 不可缓存而 POST 是。

    对此方法的响应是不可缓存的,除非响应 包括适当的 Cache-Control 或 Expires 标头字段。

    例如http://www.ebaytechblog.com/2012/08/20/caching-http-post-requests-and-responses/

    【讨论】:

    • “另一件事是 PUT 是不可缓存的,而 POST 是。” — POST 是可缓存的吗?
    • @Kay 你也应该阅读标准。 Responses to this method are not cacheable, unless the response includes appropriate Cache-Control or Expires header fields.
    • 一般来说,RTFM 的答案是没有用的,特别是当问题清楚地表明研究工作时。
    • @jaco0646 REST 是关于 Fielding 论文和应用 HTTP、URI、MIME 类型等标准......如果有人不阅读这些和/或不能应用这些,那么我几乎不能称之为研究工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多