2011-03-07 25 views
0

我想執行一個兩階段的帖子。第一個是我自己的服務創建一個AJAX帖子,創建表單數據,例如「email = blah & dude = car」等。由ajax調用遠程URL創建的表單數據

在AJAX調用的回調中,我需要將該數據重新發布到遠程站點,一個正常的職位。

我的想法是這樣的:

var formData = "some form data"; 
$.ajax({ 
    type: 'POST', 
    url: '/myservice', 
    data: formData, 
    success: function(data, status) { 
      xmlhttp=new XMLHttpRequest(); 
         xmlhttp.open("POST","http://remotepage.com",true); 
         xmlhttp.send(data); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     //display error message  }, 
    dataType: "text", 
}); 

然而,HttpRequest的失敗是由於XSS預防上remotepage.com。我如何輕鬆地將處理過的表單數據重新發布到遠程URL?

+0

,您可以執行服務器端的重職在你的web服務? – mellamokb 2011-03-07 23:34:26

回答

1

您知道由於same origin policy restrictionshttp://remotepage.com發送AJAX請求(xmlhttp.open("POST","http://remotepage.com",true);),除非您的網站託管在http://remotepage.com上,否則將無法正常工作。

所以要實現這一點,您需要在您的域上設置一個服務器端腳本,它將充當您的域和遠程域之間的橋樑,然後您會向腳本發送一個AJAX請求。此外,因爲你是使用jQuery它似乎更自然的成功回調使用它,以及:

var formData = "some form data"; 
$.ajax({ 
    type: 'POST', 
    url: '/myservice', 
    data: formData, 
    success: function(data, status) { 
     $.post('/some_bridge_script', formData); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     //display error message  }, 
    dataType: "text", 
}); 

如果遠程域支持JSONP,你可以直接將請求發送到它,但它僅限於GET請求。

+0

他的問題很好的重申。 – mellamokb 2011-03-07 23:33:45

+0

@mellamokb,對不起,我還在編輯我的答案。 – 2011-03-07 23:40:19

+0

好的。如果我要構建虛擬表單,然後使用.submit()會怎麼樣? – user648960 2011-03-07 23:45:33

0

您需要向remotepage.com發送後臺GET請求,以詢問要修改/創建的資源的表單。這將允許遠程頁面在您的cookie存儲中設置真實性令牌。隱藏此表單,使用已成功發佈到myservice的數據填充它,然後發佈隱藏表單。這樣remotepage.com將有機會檢查您是否信任。

編輯:添加代碼示例

這裏有什麼我預想有點示例代碼:

var formData = "some form data"; 
$.post({ 
    url: '/myservice', 
    data: formData, 
    success: postToRemote, 
    dataType: "JSON", 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    // display error message 
    }, 
});

因此而不是返回文本,爲MyService應該返回一個包含你所處理的數據JSON對象在下面的評論中談談。回調將從遠程頁面請求您想要的表單。一旦完成加載,匿名函數()中的塊將被執行,填充表單,然後提交它。

function postToRemote(data, status) { 
    $("#empty_container_for_form").load("http://remotepage.com/get_hidden_form", function() { 
    $("#hidden_form input#attribute_1").val(data.attribute1); 
    $("#hidden_form input#attribute_2").val(data.attribute2); 
    $.post({ 
     url: "http://remotepage.com", 
     data: $("#hiddenForm").serialize() 
    }); 
    }); 
}

此外,確保形式隱藏使用CSS:

#empty_container_for_form { display: none; }

+0

我可以在我的頁面中添加一個HTML表單,讓用戶可以將信息發佈到PayPal ...那麼爲什麼我無法自動執行Post過程? – user648960 2011-03-08 00:17:44

+0

@ user648960,可能在你提交給paypal的表單中有一些驗證令牌,對吧? api密鑰還是你向他們請求的某種東西? – muirbot 2011-03-08 00:24:07

+0

感謝您的幫助!有一個與表單一起發送的用戶標識。但是,我希望在將數據發佈到貝寶網站之前,將所有信息構建在數據對象的服務器上。所以我可以把這個數據字符串放入一個表單元素並手動發佈*手動*?我不想分析返回的數據和構建表單元素。 – user648960 2011-03-08 02:50:18