2014-10-29 18 views
2

使用AngularJS調用RESTFUL API。AngularJS在CORS預檢響應後未發送請求

在IOS上使用Chrome瀏覽器時,CORS預檢請求(選項請求)Accept標頭設置爲*/*,image/webp。響應恢復正常,但實際的GET請求永遠不會被髮送。正如你在響應中看到的,Content-Type頭文件被設置爲image/webp,我懷疑這會導致AngularJS中的問題隨GET請求一起前進。

我的假設是否正確?如果是這樣,是否強制服務器將Content-Type設置爲其他內容的解決方案?

完整請求報頭:

OPTIONS http://www.example.com:8080/resourceABC HTTP/1.1 
Host: www.example.com:8080 
Connection: keep-alive 
Access-Control-Request-Headers: accept, authorization, origin 
Access-Control-Request-Method: GET 
Origin: http://www.example.com 
Accept: */*,image/webp 
Referer: http://www.example.com/ 
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.67 Mobile/12B411 Safari/600.1.4 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

完整響應頭:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Allow: GET,OPTIONS,HEAD 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS 
Access-Control-Allow-Headers: X-HTTP-Method-Override, Content-Type, x-requested-with, authorization, accept 
Access-Control-Max-Age: 3600 
Content-Type: image/webp 
Content-Length: 0 
Date: Wed, 29 Oct 2014 19:26:37 GMT 
+0

我有這個相同的問題,我沒有修復,你有沒有設法解決這個問題? – Skintkingle 2015-10-22 16:36:00

+0

那麼,我不清楚錯誤在哪裏,無論是使用Spring還是Chromium。我記錄了鉻缺陷429507,但沒有真正遵循。我結束瞭解決問題服務器端,這裏做這個破解:(僞代碼) if(method ==「OPTIONS」&& header ==「Accept」){header.contains(「image/webp」) ){ headers.remove(「Content-Type」); headers.add(「Content-Type」,「text/plain」); } } – Marc 2015-10-23 18:58:23

回答

1

海蘭。 我剛剛在這裏訪問AngularJS服務的另一個域上的REST服務。

檢查發送到我的REST的服務的請求頭,看我允許從客戶端導致MIT要求下面的一切:

設置的訪問控制允許報頭'在一個確保它包含「Access-Control-Request-Headers」中的所有項目的方式爲我解決了這個問題。

Marc我發現在你的'Access-Control-Request-Headers'中請求了標題「origin」,但是在你的「Access-Control-Allow-Headers」中卻沒有。

發送以下響應報頭的作品在我的情況(的AppKey是頭我的內部身份驗證密鑰):

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: * 
Access-Control-Allow-Headers: appkey,content-type 

希望這是明確的,它幫助。 最好的問候, 基督教

PS:「訪問控制允許報頭:*」並沒有我的情況下工作

UPDATE:

允許通過後的申請表格,提交我不得不將'content-type'添加到'Access-Control-Allow-Headers'

+0

嗨基督教,感謝您的意見。我將'Origin'添加到'Access-Control-Allow-Headers',但同樣的問題。 在請求中,你看到'Accept:*/*,image/webp'嗎?並在你的迴應中,你是否看到'Content-Type:image/webp'?我真的認爲這與問題有關。 – Marc 2014-10-31 13:33:06

+0

我已經取得了一些進展。這與angularJS無關,我可以用簡單的AJAX請求重現。我可以通過強制服務器僅爲'OPTIONS'響應返回'Content-Type:text/plain'來解決這個問題。這是一個黑客,所以我必須明白爲什麼沒有這個黑客它返回'Content-Type:image/webp'。無論哪種方式,都有一個錯誤,爲什麼CHROME爲OPTIONS請求設置了「Accept」頭值?沒有意義。 Hy。Marc。 – Marc 2014-11-02 18:02:26

+0

Hy Marc。今天,我可以在iPAD上使用Chrome測試我的服務,並且它在請求中確實表示「接受:*/*,image/webp」。 我的迴應總是說'Content-Type:text/plain',所以你的問題不會在這裏彈出。我沒有手動設置它 - 它似乎是一個默認(很老的tomcat6)。我想知道爲什麼當'*/*'也適用時,你的框架返回'image/webp'。 我做了一些調查,但無法根據規範找出正確的CORS預檢應答內容類型。在例子中,我總是閱讀「text/plain」。 – 2014-11-04 15:12:05