【问题标题】:Is it valid to combine a form POST with a query string?将表单 POST 与查询字符串结合起来是否有效?
【发布时间】:2013-02-05 14:39:35
【问题描述】:

我知道,例如,在大多数 MVC 框架中,查询字符串参数和表单参数都可用于处理代码,并且通常合并为一组参数(通常以 POST 为优先)。但是,根据 HTTP 规范这样做是否有效?假设您要发布到:

http://1.2.3.4/MyApplication/Books?bookCode=1234

... 并提交一些更新,例如更改图书代码为 1234 的图书名称,您可能希望处理代码同时考虑 bookCode 查询字符串参数和 POSTed 表单参数更新的图书信息。这有效吗?这是个好主意吗?

【问题讨论】:

    标签: http post query-string


    【解决方案1】:

    根据 HTTP 规范是否有效?

    Yes.

    这里是将军syntax of URL as defined in those specs

    http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
    

    http_URL 的形式没有额外的限制。特别是使用的http method(即POST、GET、PUT、HEAD、...)对http URL格式没有任何限制。

    使用GET方式时:服务器可以认为请求体是空的。

    使用 POST 方法时:服务器必须处理请求正文。

    这是个好主意吗?

    这取决于您需要做什么。我建议你 link 解释 GET 和 POST 背后的想法。

    我认为在某些情况下,在 url 的 query 部分中始终包含一些参数(例如用户语言)会很方便。

    【讨论】:

    • 在这种情况下,仅链接到完整的 RFC 几乎没有帮助。你能在这里引用相关部分吗?
    • 没有“相关部分”,因为规范没有解决这个特定问题,即规范没有具体说明允许查询字符串。取而代之的是,可以根据此处给出的思路合理地推断出答案,即 POST 语义的规范没有说明不允许查询字符串。
    • 确实,POST URI 中的查询字符串是完全合法的。尽管如此,如果您在 RFC 中同时提供查询字符串和 Content-Type: application/x-www-form-urlencoded 正文,粗略地看一下,我找不到任何关于优先级的信息。我唯一能找到的似乎是Go's net/http 中最好描述的一种合理但习惯的实现定义的行为:“请求正文参数优先于 r.Form 中的 URL 查询字符串值”
    • 除非我找不到一些额外的规范,否则前面广泛观察到的行为可能是一个错误的假设,尽管服务器显然可以合法地选择将查询解释为适用于(或者更确切地说是其中的一部分)当主体应用于子资源时正在操作的资源,例如由POST 创建的子资源。因此,两者都可以包含一个不会发生冲突的同名键,因为每个键都在不同实体的范围内。
    • HTTP RFC-2616 已被新文档淘汰,这些文档更新了互联网上的最佳实践并阐明了一些观点,但在此 RFC 集中,似乎没有任何文档记录,然后禁止使用POST 方法。特别是我发现这些点是相关的:RFC-7230 §2.1. Client/Server MessagingRFC-7230 §2.7. Uniform Resource IdentifiersRFC-7231 §4.3.3. POST
    【解决方案2】:

    我知道,例如,在大多数 MVC 框架中,查询字符串参数和表单参数都可用于处理代码,并且通常合并为一组参数(通常以 POST 为优先)。

    任何有能力的框架都应该支持这一点。

    这有效吗

    是的。 HTTP 中的 POST 方法对使用的 URI 没有任何限制。

    这是个好主意吗?

    显然不是,如果您要使用的框架仍然存在线索挑战。否则,这取决于你想要完成什么。主要用例(将数据子集重定向到新的 POST 目标)一直是 irretrievably broken by browser implementations(机械地遵循 Mosaic/Netscape 的失败领导),因此这里的考虑主要是理论上的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多