【发布时间】:2013-03-17 01:53:37
【问题描述】:
我希望能够将表单提交到两个服务器。这就是原因(如果有更好的方法,我会全力以赴)
我有一个嵌入机械土耳其人的 iframe。 iframe 中有一个表单。
当工人提交表单时,我需要做两件事:
我需要通知我的本地服务器,以便我可以立即采取一些措施。 我需要将结果发布到 mturk,以便 turk 显示下一个作业。
如果我不这样做,我的服务器需要轮询土耳其人以完成工作,这是低效的。
我尝试了多种方案,但无法让它们发挥作用。
我尝试使用 ajax 在本地发布一篇文章,然后提交一份表单,使用如下代码:
<%= form_for(@task, :url => "http://workersandbox.mturk.com/mturk/externalSubmit",
:remote => true, :method => "post", :authenticity_token => false) do |f| %>
....
在我不显眼的 js 文件中
$(form).post({url: "/notify",opt, function() {console.log("notify done")});
这会导致 js 错误
XMLHttpRequest cannot load http://workersandbox.mturk.com/mturk/externalSubmit. Origin http://mytest.herokuapp.com is not allowed by Access-Control-Allow-Origin.
我无法控制服务器,所以我无法解决这个问题。
我们将不胜感激地接受有关正确方法的任何建议。
【问题讨论】:
-
直接来自客户的双重提交是一种可怕的方法。如果两台服务器需要数据,则将表单提交到一台(您的本地服务器)上的脚本,该脚本执行自己的处理并充当另一台服务器的代理 - 即。发出自己的 HTTP 请求。经过思考,您应该能够从本地服务器对客户端做出单一响应,涵盖两个方面。
-
是的,这就是我想要做的 - 但表单提交必须从客户端完成,以便土耳其人可以转发到下一张图片。从服务器执行 POST 不会刷新 iframe,因为土耳其服务器无法更新它
-
但是“下一张图片”肯定只是一个 url,可以在响应中“通过管道传递”。
-
此外,通过代理与土耳其服务器的所有交互,您应该能够清除 iFrame 以支持 div。
标签: jquery ruby-on-rails same-origin-policy mechanicalturk