这不是像这样的问题的重复,而是相反的:我有一个我通过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字符串,然后创建只有一个字段("有效载荷")的格式,并提交该.
接收端有一个过滤器,如下所示:
因此,当GET数据增长太多时,我可以在不修改实际脚本的情况下切换方法,这通常没有任何变化.
它一直有效,直到今天.
服务器应该接收单个POST提交,并在弹出窗口中打开相应的响应.
服务器确实收到了正确的POST提交...
......显然忽略了它......
...在此之后,浏览器会立即发出没有参数的GET ,这是无参数 GET 的结果,它会在弹出窗口中显示(请原谅双关语).
毫不奇怪,这总是"你没有提交任何参数"的错误.咄.
<FORM>HTML中的硬编码替换表单,没有任何jQuery.结果相同.所以,这不是一个jQuery问题.使用hurl.it或Postman等工具手动向服务器发送请求。这些工具将很好地显示来自服务器的响应,包括所有 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 ]