2013-03-27 3 views
4

Я хочу иметь возможность отправлять формы на два сервера. Вот почему (если есть лучший способ сделать это, я все уши)Отправить форму на два сервера

У меня есть iframe, встроенный в механический турк. В iframe есть форма.

Когда работник отправляет форму, мне нужно сделать две вещи:

мне нужно уведомить свой локальный сервер, так что я могу предпринять какие-то действия сразу. Мне нужно опубликовать результаты в mturk, чтобы следующая работа отображалась турком.

Если я этого не делаю, мой сервер должен опросить turk для завершения работы, что неэффективно.

Я пробовал несколько схем, но не мог заставить их работать.

Я пытался использовать Ajax, чтобы сделать один пост в местном масштабе, и одну форму представить, используя код, который выглядит следующим образом:

<%= form_for(@task, :url => "http://workersandbox.mturk.com/mturk/externalSubmit", 
:remote => true, :method => "post", :authenticity_token => false) do |f| %> 

.... 

и в моих unobstrusive JS файл

$(form).post({url: "/notify",opt, function() {console.log("notify done")}); 

Это приводит к in a js error

XMLHttpRequest cannot load http://workersandbox.mturk.com/mturk/externalSubmit. Origin http://mytest.herokuapp.com is not allowed by Access-Control-Allow-Origin. 

У меня нет контроля над сервером, поэтому я не могу исправить эту проблему.

Любые предложения относительно правильного способа сделать это были бы с благодарностью приняты.

+4

Двойное представление прямо из клиента - это ужасный подход. Если двум серверам нужны данные, отправьте форму на скрипт на одном (ваш локальный сервер), который выполняет свою собственную обработку и действует как прокси-сервер для другого сервера, т. Е. делает собственный HTTP-запрос. С мыслью вы должны иметь возможность сделать один ответ с локального сервера клиенту, охватывающий оба аспекта. –

+0

Да, это то, что я хотел бы сделать, но форму submit нужно сделать от клиента, чтобы турк мог перейти к следующему изображению. выполнение POST с сервера не обновит iframe, так как у turk-сервера нет возможности его обновить. –

+0

Но, безусловно, «следующее изображение» - это всего лишь URL-адрес, который можно «пропустить» в ответ. –

ответ

1

Я решил, что я думал обо всех неправильно это. Я не должен пытаться представить форму дважды. Вместо этого я отправляю только туркмену и пользуюсь службой уведомлений с помощью SQS (http://docs.aws.amazon.com/AWSMechTurk/latest/AWSMechanicalTurkRequester/Concepts_NotificationsArticle.html), чтобы получать уведомления об изменениях на сервере

2

Это легко сделать с помощью 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> 

Вы могли бы иметь следующий JQuery код, который выполняет POST

$(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; 
    }); 
}); 
+1

Спасибо за предложение - попробовал это, без кубиков. Я получаю ту же ошибку: XMLHttpRequest не может загрузить http://workersandbox.mturk.com/mturk/externalSubmit. Происхождение http://mytest.herokuapp.com не разрешено Access-Control-Allow-Origin. –

+1

Вы пытаетесь загрузить данные с сервера? XMLHttpRequest сигнализирует, что вы пытаетесь прочитать данные из разных доменов, чем то, от чего вы подаете форму. –

Смежные вопросы