HTML表单似乎提交*POST和GET?

LSe*_*rni 7 javascript forms

这不是像这样的问题的重复,而是相反的:我有一个我通过jQuery提交的表单

    $('<form>', {
        action  : 'service',
        method  : 'post',
        target  : '_blank'
    }).append(
        $('<input>', {
            type    : 'hidden',
            name    : 'payload',
            value   : JSON.stringify(payload)
        })
    ).appendTo('body').submit().remove();
Run Code Online (Sandbox Code Playgroud)

这样做是为了让我可以用HTML打开不同的页面.

因为我需要提交相当多的复杂的信息,我实际上做的是它们序列化放到一个大JSON字符串,然后创建只有一个字段("有效载荷")的格式,并提交.

接收端有一个过滤器,如下所示:

  • 如果方法是POST,
  • 并且只有一个提交的变量,
  • 并且该一个变量的名称是"payload",
  • 然后 JSON解码它的值并用它来创建假的GET数据.

因此,当GET数据增长太多时,我可以在不修改实际脚本的情况下切换方法,这通常没有任何变化.

它一直有效,直到今天.

应该怎么做

服务器应该接收单个POST提交,并在弹出窗口中打开相应的响应.

究竟发生了什么

服务器确实收到了正确的POST提交...

......显然忽略了它......

...在之后,浏览器会立即发出没有参数的GET ,这是无参数 GET 的结果,它会在弹出窗口中显示(请原谅双关语).

毫不奇怪,这总是"你没有提交任何参数"的错误.咄.

我已经做了什么

  • 验证了这种方法的有效性,并且在过去几年中始终以不同的形式和不同的服务端点工作
  • 尝试用<FORM>HTML中的硬编码替换表单,没有任何jQuery.结果相同.所以,这不是一个jQuery问题.
  • 尝试使用不同的浏览器(如果它只适用于某些浏览器,它就不会有用:我需要支持大多数现代浏览器.但是,我检查过.幸运的是,这种失败在所有这些中都会重现,甚至在iPhone上也是如此).
  • 尝试发送少量数据(只是"{test:0}").
  • 尝试在收到任何东西时立即停止端点脚本.
  • 已检查Stack Overflow.我发现了什么似乎是同样的问题,在不同的 口味,但它是一点安慰.这个有一个有趣的问题,但没有,它没有帮助.
  • 检查防火墙,代理,广告拦截器和插件(我现在使用普通的vanilla Firefox).
  • 打电话给IT人员并询问有关最近SVN提交的尖锐问题.没有.

我还没做什么

  • 检查低级别的HTTPS对话(我没有足够的访问权限).
  • 比较配置,一步一步,它的工作原理的服务器和新服务器的配置.
  • 很明显,戴上我的思维帽子.有一定的东西很明显,我很想念和我设置了我自己的一个相当大的捂脸.

Fab*_*ler 3

使用hurl.itPostman等工具手动向服务器发送请求。这些工具将很好地显示来自服务器的响应,包括所有 HTTP 标头。我怀疑服务器响应重定向(状态代码30X),这导致完成GET后发出请求POST


更新:HTTP 重定向

HTTP 重定向不一定使用相同的 HTTP 方法甚至相同的数据来向重定向目标发出请求。特别是对于非幂等请求,这可能是一个安全问题(您通常不希望您的表单提交自动重新提交到另一个地址)。然而,HTTP 为您提供了两种选择:

[...] 因此,HTTP/1.1 ( RFC 2616 ) 添加了新的状态代码 303 和 307 [...],其中 303 强制将请求类型更改为 GET,而 307 则保留最初发送的请求类型。尽管这种歧义消除提供了更大的清晰度,但 302 代码仍然在 Web 框架中使用,以保持与未实现 HTTP/1.1 规范的浏览器的兼容性。

[来自维基百科:HTTP 302 ]

同样适用于 301:

如果收到 301 状态代码以响应除 GET 或 HEAD 之外的任何类型的请求,则客户端必须在重定向之前询问用户。

[来自维基百科:HTTP 301 ]