簡體   English   中英

提交跨域ajax POST請求

[英]Submit cross domain ajax POST request

我發誓,我曾經在某個方面看過一篇關於此事的文章但卻找不到......

如何在另一個域上執行POST類型的jQuery ajax請求? 必須在沒有代理的情況下完成。 這可能嗎?

是的你可以發布你想要的所有內容,甚至是$.post()可以......但是你不會得到回復。

這樣,其他域獲得POST:

$.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) {
  //data will always be null
});

但是,由於同源策略 ,上面示例中的響應data將為null。

我嘗試過的所有選項:

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等)中不起作用

所以我們目前做以下算法:

  • 如果請求足夠小,請使用JSONP
  • 如果不夠小,但用戶有閃光燈,請使用FlXHR
  • 否則使用分塊JSONP

花一個下午寫下來,你就可以好好利用它了。 將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">

如果要解析響應,則使用代理(如果唯一的實際選項)。

如果你絕望 ,並控制遠程站點,那么你可以:

  1. 提交上述表格
  2. 在響應中設置一個cookie(在iframe可能導致cookie被視為'第三方'之前可能被阻止(即可能是廣告跟蹤)。
  3. 等待足夠長的時間讓回復回來
  4. 動態生成一個腳本元素,其中src指向遠程站點
  5. 在響應中使用JSON-P並利用先前存儲在cookie中的數據

這種方法受到競爭條件的影響並且通常很難看。 通過當前域代理方式的數據是一個更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM