【问题标题】:Submit a form to two servers向两台服务器提交表单
【发布时间】: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


【解决方案1】:

使用 jQuery 很容易做到这一点。本质上,如果您使用 .serialize() 方法,您可以将数据发布到任意数量的地方。

假设您有这样的表格:

<form>
    <input type="text" id="field1" name="field1" value="abc123" />
    <input type="text" id="field2" name="field2" value="def456" />
    <input type="submit" value="Submit" />
</form>

您可以使用以下执行 POST 的 jQuery 代码

$(function() {
    $('form').submit(function() {
        var data = $(this).serialize();

        $.post("http://www.location1.com/somePlace/", data, function() { });
        $.post("http://www.location2.com/anotherPlace/", data, function() { });

        return false;
    });
});

【讨论】:

  • 感谢您的建议 - 试过了,没有骰子。我得到同样的错误:XMLHttpRequest 无法加载workersandbox.mturk.com/mturk/externalSubmit。 Access-Control-Allow-Origin 不允许来源mytest.herokuapp.com。
  • 您是否尝试从服务器加载数据? XMLHttpRequest 将表明您正在尝试从不同于您提供表单的域中读取数据。
【解决方案2】:

我认为我的想法全错了。我不应该尝试提交表单两次。相反,我只提交给土耳其人,并使用他们的通知服务,使用 SQS (http://docs.aws.amazon.com/AWSMechTurk/latest/AWSMechanicalTurkRequester/Concepts_NotificationsArticle.html) 来获取服务器上更改的通知

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2016-12-19
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多