[英]Submit cross domain ajax POST request
我發誓,我曾經在某個方面看過一篇關於此事的文章但卻找不到......
如何在另一個域上執行POST類型的jQuery ajax請求? 必須在沒有代理的情況下完成。 這可能嗎?
我嘗試過的所有選項:
1)PORK: http : //www.schizofreend.nl/Pork.Iframe/Examples/創建一個iframe並在那里提交帖子,然后讀取響應。 每個請求仍需要相同的基本域(即www.foo.com可以從www2.foo.com請求數據,但不能從www.google.com請求數據)。 還需要你擺弄document.domain
屬性,這會導致不良副作用。 並且在所有主流瀏覽器中存在一個普遍存在的問題,即如果動態編寫任何iframe,則重新加載頁面基本上會對頁面上所有iframe的緩存內容進行洗牌。 您的回復數據會顯示在廣告所在的框中。
2)flxhr: http ://flxhr.flensed.com/甚至可以用來掩蓋jQuery的內置ajax,所以你甚至都沒有注意到它。 雖然需要閃存,所以iPhone出局了
3)jsonp:如果您發布了大量數據,則無效。 噓。
4)chunked jsonp:當你的jsonp請求太大時,將查詢字符串分解為可管理的塊並發送多個get請求。 在服務器上重建它們。 這很有用,但如果您在服務器之間對用戶進行負載平衡,則會出現故障。
5)CORS: http : //www.w3.org/TR/cors/在舊瀏覽器(IE7,IE6,Firefox 2等)中不起作用
所以我們目前做以下算法:
花一個下午寫下來,你就可以好好利用它了。 將CORS添加到我們的算法可能有助於更快的iPhone支持。
如果您可以控制在其他域上運行的代碼,只需讓它在響應中返回適當的Access-Control-Allow-Origin
標頭。 另請參閱MDC上的HTTP Access-Control
。
如果您需要知道POST成功,並且無法控制遠程服務器:
$.ajax({
type:"POST",
url:"http://www.somesite.com/submit",
data:'firstname=test&lastname=person&email=test@test.com',
complete: function(response){
if(response.status == 0 && response.statusText == "success")
{
/* CORS POST was successful */
}
else
{
/* Show error message */
}
}
});
如果提交有問題,則response.statusText
應該等於"error"
。
注意:某些遠程服務器將發送HTTP標頭Access-Control-Allow-Origin: *
,這將導致200 OK
HTTP狀態代碼響應。 在這種情況下,ajax將執行success
處理程序,並且不需要此方法。 要查看響應,只需執行console.log(JSON.stringify(response));
或使用FireBug的'Net'面板。
如果您想要點火並忘記POST而不關心響應,那么只需將表單提交給隱藏的iframe即可。 這需要Transitional Doctype。
<form method="POST" action="http://example.com/" target="name_of_iframe">
如果要解析響應,則使用代理(如果唯一的實際選項)。
如果你絕望 ,並控制遠程站點,那么你可以:
這種方法受到競爭條件的影響並且通常很難看。 通過當前域代理方式的數據是一個更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.