代码之家  ›  专栏  ›  技术社区  ›  Ian Mackinnon

POST/Redirect/GET(PRG)与有意义的2xx响应代码

  •  12
  • Ian Mackinnon  · 技术社区  · 14 年前

    因为POST/Redirect/GET(PRG)模式中的POST请求返回一个重定向( 303 See Other )关于成功的状态码,是否有可能告知客户他们将享受的成功的特定味道(如OK、Created、Accepted等)以及任何适当的标题(如。 Location 为了一个 201 Created ,哪个可能与重定向的冲突?

    例如,使用POST响应所期望的正确响应代码和头使重定向的GET响应合适吗?

    这个 HTTP 1.1 规格说明:

    该方法(303)主要用于允许后激活脚本的输出将用户代理重定向到所选资源。

    但是没有提供任何关于丢失更常见的状态代码和头的信息。

    编辑-示例:

    客户端将POST请求发送到 /orders 它在 /orders/1 .

    如果服务器发送 创建201 状态 location: /orders/1 ,一个自动化的客户端会很高兴,因为它知道资源是创建的,并且知道它在哪里,但是使用web浏览器的人会不高兴,因为他们得到了页面 /命令 再说一次,如果他们刷新了,他们会发送另一个订单,这不太可能是他们想要的。

    如果服务器发送 303见其他 状态 位置:/订单/1 人类将被带到他们的命令,告知它的存在和状态,并不会有意外地重复它的危险。不过,自动客户端不会被明确告知资源的创建,它必须根据 location 头球。此外,如果 303 重定向到其他地方(如。 /users/someusername/orders )人类可能很容易适应,但自动化的客户机却完全不知情。

    我的建议是 创建201 作为对新资源上重定向的get请求的响应,但是我越想越不喜欢它(可能很难确保只有创建者收到 201 而且看起来 GET 请求创建了资源)。

    在这种情况下,最佳的反应是什么?

    2 回复  |  直到 14 年前
        1
  •  3
  •   M Nottingham    13 年前

    在响应体中以HTML形式发送人类目标信息。不要在用户代理头上进行区分;如果还需要向计算机发送正文,请根据接受请求头进行区分。

        2
  •  1
  •   kellogs    14 年前

    如果您可以控制web服务器,那么如何区分代理头呢? 填写一些你只知道的东西(一个GUID或其他伪随机的东西),然后从自动客户端向web服务器展示这个。然后相应地使webserver响应为201/303。