2016-04-02 31 views
5

我必須從我的網站到第三方域/服務器進行Web服務呼叫。 雖然我正在使用內容類型爲text/plain的Post方法使用jQuery Ajax進行此調用,並且它工作正常。跨郵電與郵政工作,但與飛行前失敗

但是當我將其更改爲內容類型:文本/ XML則拋出:

迴應預檢要求未通過訪問控制檢查:沒有 「訪問控制允許來源'標題出現在請求的 資源中。

即使它設置在第三方服務器上以允許訪問我們的網站。我們正在使用content-type:text/plain進行調用時獲取此標頭。

我們還在第三方服務器上添加了以下內容。

Access-Control-Allow-Methods : Get , Post , Options ,PUT 

Access-Control-Allow-Headers: Authorization,origin, content-type, accept 

請讓我知道什麼可能是飛行前請求沒有得到'Access-Control-Allow-Origin'作爲響應的原因?

+0

我已將Soap服務更改爲Rest服務,現在選項調用具有所有必需的control-access- *標頭。我不知道Soap Call有什麼問題。 – yashpal

回答

0

你的腳本爲text/plain工作的原因是因爲它是一個簡單的請求。如果你看看this answer,你可以看到你的文本/普通請求符合簡單請求的要求。但是,將內容類型更改爲text/xml時,會將其更改爲「非簡單」請求。

爲了使您的「非簡單」請求起作用,您需要查看如何提出飛行前請求。 This website解釋瞭如何在「處理非簡單請求」下執行該操作。

更新

剛一說明: 的Access-Control-Allow-Methods鑄造敏感(全部大寫),並且你不需要列出用於簡單的請求(GET,HEAD,POST)的任何方法。 - source

Access-Control-Allow-Methods: OPTIONS, PUT 
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept 

Firefox不包括同源請求的Origin標。但Chrome和Safari在同源POST/PUT/DELETE請求中包含一個Origin標頭(同源GET請求不會有Origin標頭)。

原點是否有可能相同?

請問您的caching有問題嗎?

確保你有這些settings您的jQuery Ajax調用:

crossDomain: true // Will force a cross domain request 
cache: false 
+0

是的,我知道這是簡單的要求,另一個是「不是那麼簡單的要求」。問題是,在一個請求我得到所有訪問控制 - *標題,但在選項我沒有得到這些頭。所以我的「不是那麼簡單的請求」就失敗了。 – yashpal

+0

@yashpal我已經更新了我的答案。 – GreeKatrina

0

content-type:text/plaincontent-type: text/xml之間的差別是: 「文/ XML」 要求 「預檢」,而是 「text/plain的」 沒有。

MDN

它使用比GET,HEAD或POST的其它方法:

特別地,如果請求被預檢。另外,如果POST使用 來發送具有除 application/x-www-form-urlencoded,multipart/form-data或text/plain之外的內容類型的請求數據,例如 。如果POST請求使用 application/xml或text/xml向服務器發送XML有效內容,則會預先顯示該請求。

一些潛在的原因,那些能引起預檢要求的故障:

  1. CORS沒有被服務器啓用。搜索如何爲您的服務器技術啓用CORS。
  2. 服務器不消耗「text/plain」以外的請求。例如; Spring有一個consume option,它定義了哪種內容類型可以接受。
  3. 您的帖子中有一個「授權」標題。如果您使用憑證發送請求,則還應該添加Access-Control-Allow-Credentials: true標題。再次來自MDN