2013-06-02 27 views
0

我手動構建一些XML發佈到我們的服務器,我驗證了XML,它是有效的,沒有錯誤。jQuery的 - POST XML字符串到服務器

這是帖子:

$.ajax({ 
    type: 'POST', 
    url: submitUrl, 
    data: xmlString, 
    dataType: 'text', 
    beforeSend:function() { 
     console.log(submitUrl); 
    }, 
    success:function(data) { 
     console.log(data); 
    }, 
    error:function(error) { 
     console.log(error); 
    } 
}); 

var xmlString是一個包含XML文本字符串,我不能公開發布其不幸,但在本質上,它看起來像:

var xmlString = '<?xml version="1.0" encoding="utf-8"?> ... ' 

代碼運行在網絡服務器,而不是本地,但我似乎得到的是:

XMLHttpRequest cannot load <URL>. Origin <URL> is not allowed by Access-Control-Allow-Origin. 

然而,服務器是打開的,並沒有鎖定到這些類型的請求,所以帖子應該會通過,但是我每次都會收到上述消息。

任何想法,我可以嘗試的東西,我可以得到更好的調試消息的方式?

+0

您是否有可能對該請求產生相同的原產地策略?提交網址在不同的域名? –

+0

我不認爲這是關於打開請求或關閉或w/e。它仍然是跨域請求,並且不允許。你應該使用JSONP技術來做這樣的事情。 或者你對你的本地php文件做了ajax請求,然後從那個文件中發送xml字符串到新的服務器並取回響應並返回到ajax。 – arma

回答

2

您的代碼實際上是試圖製作跨域(CORS)請求,而不是普通的POST。

現代瀏覽器將只允許對作爲源HTML頁面的相同域中的頁面進行Ajax調用。

換句話說,無論何時試圖發出Ajax請求的HTML頁面與目標URL都不在同一個域中,瀏覽器都不會(如您所期望的那樣)進行調用。相反,它會嘗試提出CORS請求。

你說:

(...)服務器開放不鎖定到這些類型的請求(...)

調試更好:看看在頁面和服務器之間進行的網絡事務(發送請求和接收到響應)。 (在Chrome中,它是F12 + Network標籤。)如果仔細觀察,則不會發送POST。相反,請求是OPTIONS。瀏覽器期望響應包含一個Access-Control-Allow-Origin標頭,其中包含HTML頁面所在的域URL。OPTIONS的響應不包含或不包含這些標頭。您的瀏覽器然後總結這樣的訪問是不允許的,因此錯誤。

更多關於CORS:

跨源資源共享(CORS)1是一種機制,允許網頁製作XMLHttpRequests到另一個域。由於same origin security policy,這種「跨域」請求將被網頁瀏覽器禁止。

說得很快,執行CORS請求時,您的瀏覽器:

  • 會首先發一個OPTION請求發送到目標URL
  • 然後只有服務器響應到OPTION包含允許CORS請求的adequate headers (Access-Control-Allow-Origin is one of them),瀏覽器將執行調用(幾乎與HTML頁面處於相同域時的方式完全相同)。
    • 如果預期的標題不來,瀏覽器只是放棄(就像它對你)。

如何解決呢?最簡單的方法是在服務器上啓用CORS(啓用必要的標題)。如果您沒有服務器端訪問權限,則可以從其他位置鏡像Web服務,然後在其中啓用CORS。

相關問題