草庐IT

javascript - HTML 表单似乎正在提交 *both* POST 和 GET?

coder 2024-07-25 原文

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

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

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

由于我需要提交相当多的复杂信息,我实际做的是将它们全部序列化为一个大的 JSON 字符串,然后创建一个只有一个字段(“payload”)的表单并提交那个.

接收端有一个过滤器是这样的:

  • 如果方法是POST,
  • 并且只有一个提交的变量,
  • 那个变量的名字是“payload”,
  • 然后对其值进行 JSON 解码并使用它来创建伪造的 GET 数据。

因此,当 GET 数据增长太多时,我可以在不修改实际脚本的情况下切换方法,该脚本根本不会注意到任何变化。

直到今天它一直有效。

应该发生什么

服务器应接收单个 POST 提交,并在弹出窗口中打开适当的响应。

实际发生了什么

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

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

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

毫不奇怪,这始终是“您没有提交任何参数”错误。呃。

我已经做了什么

  • 验证此方法有效,并且在过去几年中对不同的形式和不同的服务端点一直有效
  • 尝试用硬编码 <FORM> 替换表单在 HTML 中,没有任何 jQuery。相同的结果。所以,这不是 jQuery 问题。
  • 尝试了不同的浏览器(如果它只适用于某些浏览器,那将无济于事:我需要支持大多数现代浏览器。但是,我检查了。幸运的是,这种故障在所有浏览器中重现,即使在 iPhone 上也是如此)。
  • 尝试发送少量数据(只是“{ test: 0 }”)。
  • 尝试在端点脚本收到任何内容后立即停止端点脚本。
  • 检查了 Stack Overflow。我找到了什么 seems to be the same problem , 在 various flavours ,但这并没有什么安慰。 This one有一个有趣的陷阱,但不,它没有帮助。
  • 检查防火墙、代理、广告拦截器和插件(我现在使用普通的 Firefox)。
  • 调用 IT 人员并询问有关最近 SVN 提交的尖锐问题。没有。

我还没有做什么

  • 检查低级别的 HTTPS 对话(我没有足够的访问权限)。
  • 逐步比较可以正常工作的服务器的配置和不能正常工作的新服务器的配置。
  • 很明显,戴上我的思考帽。 一定有什么很明显是我遗漏的,我正在为自己准备一个相当大的脸掌。

最佳答案

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


更新:HTTP 重定向

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

[...] For this reason, HTTP/1.1 (RFC 2616) added the new status codes 303 and 307 [...], with 303 mandating the change of request type to GET, and 307 preserving the request type as originally sent. Despite the greater clarity provided by this disambiguation, the 302 code is still employed in web frameworks to preserve compatibility with browsers that do not implement the HTTP/1.1 specification.

[from Wikipedia: HTTP 302]

同样适用于 301:

If the 301 status code is received in response to a request of any type other than GET or HEAD, the client must ask the user before redirecting.

[from Wikipedia: HTTP 301]

关于javascript - HTML 表单似乎正在提交 *both* POST 和 GET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848396/

有关javascript - HTML 表单似乎正在提交 *both* POST 和 GET?的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  4. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  5. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

随机推荐