2014-03-13 30 views
1

我正在嘗試對服務器執行HTTP POST。

我要發送的數據是一個json對象。

問題是$ http.post in角重載帶選項的方法。

我可以讓這個配置

.config(['$httpProvider', function ($httpProvider) { 
    //Reset headers to avoid OPTIONS request (aka preflight) 
    $httpProvider.defaults.headers.common = {}; 
    $httpProvider.defaults.headers.post = {}; 
    $httpProvider.defaults.headers.put = {}; 
    $httpProvider.defaults.headers.patch = {}; 
}]) 

,並從選項更改爲POST,但我無法設置內容類型爲「application/JSON」,和我得到一個「415不支持的媒體類型「

謝謝

+0

你有控制你正在訪問的服務器嗎?它可能不支持OPTIONS方法請求。通過$ httpProvider使用CORS時無法避免預檢。 – Brian

回答

6

$ http.post的角度不覆蓋與選項的方法。看起來你試圖在不同於你的JS代碼來自的域中調用api。這被稱爲跨域。對於這種情況,瀏覽器使用OPTIONS執行預檢請求以查看返回的標題。在你的後端響應中,例如你應該添加標題Access-Control-Allow-Origin: *。當瀏覽器看到這個頭部時,他執行實際的POST請求。

更多細節在這裏:https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS

希望這是有幫助!

+0

謝謝你,這也正是它正在發生,但是我已經在服務器中擁有Access-Control-Allow-Origin:*,並且出現相同的錯誤。 – agusgambina

+1

@agusgambina:在Chrome中打開devtools,這個例外到底在控制檯中有效嗎? – Naor

+0

服務器不允許CORS,所以我正在尋找我有哪些選項可用,其中一個是實現代理來發出請求。感謝@Naor的答案。 – agusgambina

1

添加

$httpProvider.defaults.headers.post['Content-Type'] = 'application/json'; 

但請注意,這將全局設置Content-Type標題。

如果您需要設置每次通話的內容類型,你應該使用$http.post

$http.post("/foo/bar", requestData, { 
     headers: { 'Content-Type': 'application/json'}, 
     transformRequest: transform 
    }).success(function(responseData) { 
     //do stuff with response 
    }); 
+0

感謝您的回覆。我試了兩種,把它放在全局和本地的函數中,但是結果相同,把請求方法改爲選項。 – agusgambina

+1

不應該這樣做,$ http.post的默認值是application/json。有關您的版本,請參閱/ docs/api/ng/service/$ http,搜索'設置HTTP標題'。 – Brian

+1

這實際上對我有用。 不得不使用 '$ http.post(URL,數據)' 代替 '$ HTTP({方法: 'POST',數據:數據})' – AceMark

相關問題