2014-07-22 61 views
7

我正在嘗試使用Angular $ http與下面的代碼進行交叉源POST請求。

//I've tried setting and removing these http config options 
$http.defaults.useXDomain = true; 
delete $http.defaults.headers.common['X-Requested-With']; 
$http.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'; 

//Basic request, with some private headers removed 
return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    params: params, 
    url: url 
}); 

預檢OPTIONS請求得到一個200 OK,但是隨後的POST接收400 Bad Request響應。查看Chrome調試窗口中的跟蹤,我沒有看到POST的Content-Type: application/x-www-form-urlencoded; charset=UTF-8標頭。我假設這就是服務器返回錯誤請求響應的原因。

我設置了一些其他自定義標題,我已經省略了上面的代碼,並且它們正在發送並顯示正常。

我還應該提及,我可以使用Chrome的Advanced Rest Client應用程序發出此請求並收到正確的回覆。 (一個訪問令牌)

我也試過只是做一個直接的XMLHttpRequest(),但我得到了同樣的錯誤。

任何有關爲什麼我的Content-Type標頭沒有設置的見解?

+0

可能重複[Angular,內容類型不是使用$ http發送](http://stackoverflow.com/questions/16194442/angular-content-type-is-not-being-sent-with-http) –

回答

11

如果不發送任何數據,我不確定Content-Type標題將被髮送。添加data對象和嘗試:

return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    data: data, 
    url: url 
}); 

而且,通常用後您使用的data代替params(獲得)。

您也可以參考這個SO疑問,對如何,如果你需要轉換數據一些更多的信息來:How can I post data as form data instead of a request payload?

+1

是的,謝謝。我現在意識到了。當我傳遞一些數據時頭顯示。儘管如此,仍然會收到'400錯誤請求'。所以我想這個問題已經得到解答,但我仍然得到相同的迴應。不知道發生了什麼事。 – user3783608

+0

你的問題是關於內容類型。如果您有關於400請求的單獨問題,請使用特定的代碼位(服務器和客戶端)創建一個新問題。我的猜測是你沒有發送帶有請求的令牌(在標題???) – lucuma

+1

我正在發送數據,它仍然沒有被設置。 – AlxVallejo

1

我的問題是,我是在data變量設置爲一個對象而不是一個字符串。

return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    data: {'key1':'value1', 'key2':'value2'}, 
    url: url 
}); 

一旦我將它更改爲data:'key1=value1&key2=value2'它工作正常。在那裏還有一個反斜槓,我不得不手動輸入代碼爲%5c

+0

您也可以根據請求進行轉換。看到60個upvotes的答案(第五個下來)http://stackoverflow.com/questions/11442632/how-can-i-make-angular-js-post-data-as-form-data-instead-of-a - 請求 - 有效載荷 – lucuma

7

如果數據屬性未定義,則'Content-Type'頭未被添加到請求中,您可以發送空字符串作爲數據「」,例如。

var req = { 
       method: 'GET', 
       url: '<your url here>', 
       //headers: { 
       // 'Content-Type': 'application/json;charset=utf-8' 
       //}, 
       data: "" 
      }; 
    $http(req); 
+0

很好用!!!,這是一個角度錯誤還是什麼? –

0

比你非常「麗然B」你的工作修復像一個冠軍對我來說....問題是從幾個小時纏着我....

var req = { 
       method: 'GET', 
       url: '<your url here>', 
       //headers: { 
       // 'Content-Type': 'application/json;charset=utf-8' 
       //}, 
       data: "" 
      }; 

    $http(req); 
1

我面臨着同樣的問題,同時設置標題。我們需要發送的數據參數在$http要求這樣

$http({ 
    method: 'POST', 
    headers: { 'Content-Type': 'application/json}, 
    data: {}, 
    url: url 
}); 

我們也可以發送空白數據。它會正常工作。

+0

數據參數是強制性的 –

相關問題