angular.js - 同一資源jquery跨域成功$resource().save()失敗
問題描述
jquery的請求如下:
angularjs的請求如下:
問題解答
回答1:你仔細(xì)看下你的兩個請求在request上的差異,我說的是content-type這個部分,jquery默認(rèn)的content-type是application/x-www-form-urlencoded,是簡單請求,不需要preflight(就是第二張圖里的options請求)。而angular默認(rèn)的post請求的content-type是application/json,這是復(fù)雜請求,主要進(jìn)行preflight,但你既然碰到錯誤了,就說明你的后端并沒有處理options情況,兩個解決辦法:
手動給你的angular resource服務(wù)設(shè)置header,將content-type改成application/x-www-form-urlencoded。(不確定resources是否可以自定義header,因為resources其實是標(biāo)準(zhǔn)restful服務(wù))
要求你的后端程序做相應(yīng)修改,使之能夠處理復(fù)雜請求(實際是非常小的改動,無論java, python還是ruby on rails都有現(xiàn)成的解決方案)
回答2:你注意看 你用jquery發(fā)送請求的時候,響應(yīng)的Response Headers設(shè)置了 Access-Control-Allow-Origin,因此你可以跨域;但是你用Angular發(fā)送的時候這個頭沒有,應(yīng)該是你服務(wù)器端響應(yīng)的邏輯做了什么判斷,導(dǎo)致這個頭沒有正常設(shè)置。
回答3:@依云 并不是 Angular 認(rèn)為需要 preflight,而是瀏覽器認(rèn)為(由于 Angular 對 HTTP 請求的配置,Content-Type 和 Cache-Control,根據(jù) MDN 文檔)需要發(fā)起 preflight。
@YAN_YANG 從響應(yīng)頭來看,你的服務(wù)器允許 preflight 請求,你可以從服務(wù)端把這個刪掉。不清楚你是怎么配置 CORS 的,舉個例子比如在 Apache 里有類似的設(shè)置:
Header set Access-Control-Allow-Methods 'PUT, GET, POST, DELETE, OPTIONS'
把 OPTIONS 選項去掉可以直接避免去響應(yīng) preflight,當(dāng)然你合理的處理它才是正確的。(參見:http://stackoverflow.com/questions/23954433/post-request-with-angularj...)
另外你 Angular 那邊設(shè)置了正確的 request headers 嗎?(針對 CORS 的)
http://chstrongjavablog.blogspot.sg/2013/04/enabling-cors-for-jetty.ht...
這篇文章解釋了 OPTIONS 的種種困擾,以及為什么 jQuery 沒問題(針對 CORS 專門去除了 HEADER),另外還有一個 Java 的 CORS 實現(xiàn),和請求時 HEADER 的設(shè)置。Angular 怎么設(shè),查 $httpProvider 的文檔即可。
相關(guān)文章:
1. list - python 求助2. linux - Ubuntu下編譯Vim8(+python)無數(shù)次編譯失敗3. python - TypeError: tryMsgcode() takes exactly 2 arguments (0 given)4. javascript - react,獲取radio的值出錯5. css - 移動端 line-height安卓錯位,蘋果機(jī)正常用,縮放解決了,可是又出來了占位的問題6. extra沒有加載出來7. javascript - 彈出一個子窗口,操作之后關(guān)閉,主窗口會得到相應(yīng)的響應(yīng),例如網(wǎng)站的某些登錄界面,django后臺的管理等,這是怎么實現(xiàn)的呢?8. 環(huán)境搭建 - anaconda 創(chuàng)建python2.7環(huán)境中打開編譯器確是3.6版本9. mysql replace 死鎖10. 求救一下,用新版的phpstudy,數(shù)據(jù)庫過段時間會消失是什么情況?
