【问题标题】:What is the W3C stance on sending GET params in a POST request?W3C 在 POST 请求中发送 GET 参数的立场是什么?
【发布时间】:2014-04-03 22:23:26
【问题描述】:

标题几乎概括了它。许多网络语言支持在 POST 请求中发送/接收 URL 编码的 GET 参数。根据 HTTP 标准,这是一种可接受的做法吗?

【问题讨论】:

  • 这绝不是一个规范的答案,但我认为就 HTTP 而言,“GET 参数”只是 URL 字符串的一部分,没有内在含义。我猜,在 HTML 表单中混合硬编码查询字符串参数的做法(设置了 GET 或 POST 方法)以及它们在 CGI 下的行为,可能会被其他一些标准或建议所涵盖。

标签: php ajax http


【解决方案1】:

HTTP 而言,没有“GET 参数”之类的东西。 URL 标识一个资源,您可以对该资源执行各种操作,包括GETting 和POSTing 数据。从这个角度来看,将资源标识为https://api.example.com/item?id=42 并执行POST 请求以更新该项目是完全有效的。它很可能用在所谓的“RESTful API”中,尽管更常见的是动态 URL,例如 https://api.example.com/item/42

URL 的查询字符串部分有时被认为是“GET 参数”的原因是因为它是当您使用method="get"HTML 中提交表单时生成的部分。一个表单可以有一个带有查询字符串的action URL,和一个method,表明数据应该通过POST 请求发送到该URL。拥有一个现有的查询字符串和一个"get"method 导致浏览器必须准确地决定如何将两者结合起来,但是查询字符串+“post”不会出现冲突。

最后,您提交到的页面将需要实际处理您的数据。许多简单的 CGI 库将从查询字符串和 POST 提交的表单中解析的变量合并在一起。这可能是您想要的,或者您可能希望将它们视为两个独立的“命名空间”。例如,PHP 允许这两种方法,提供 $_GET(查询字符串变量,无论 HTTP 方法如何)和 $_POST(POST 表单数据)以及 $_REQUEST,它以可配置的方式将两者结合在一起。

【讨论】:

    【解决方案2】:

    根据规范 - 允许:

    Request-Line   = Method SP Request-URI SP HTTP-Version CRLF
    
    Request-URI    = "*" | absoluteURI | abs_path | authority
    
    absoluteURI   = scheme ":" ( hier_part | opaque_part )
    
    hier_part     = ( net_path | abs_path ) [ "?" query ]
    

    参考资料:

    【讨论】:

      【解决方案3】:

      通过 POST in url-encoded format 发送参数不仅是允许的,它是the default for encoding POST data。引用 HTML 表单的规范:

      enctype = 内容类型 [CI] 此属性指定用于将表单提交到服务器的内容类型(当 method 的值为“post”时)。此属性的默认值为“application/x-www-form-urlencoded”。值“multipart/form-data”应与 INPUT 元素 type="file" 结合使用。

      【讨论】:

      • 当然有道理。例如,POST /items?id=50 可能会将一些信息发布到项目 50。如果 id 在您要发布的数据之外有意义,那么将它放在 URL 中实际上更有意义,IMO。
      • URL 中的查询参数有时称为“GET 参数”,因为它们几乎总是在 GET 请求中使用——它们是唯一普遍支持的通过 GET 发送信息的方式。 (并非所有 API 都允许您指定 cookie,允许您设置自定义标头的 API 较少,并且很少允许您包含正文。)
      • @cHao:是的,你是对的,谢谢。我已经删除了那部分。作为答案,这仍然应该足够有用,允许 url 编码并且默认通过 POST 传输数据。
      猜你喜欢
      • 2015-08-06
      • 2018-04-23
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      相关资源
      最近更新 更多