今天想到以前碰到的一個問題,在使用angularJs+ssm寫東西時碰到的一個使用$http.post()傳遞Json時報錯 415 (Unsupported Media Type) 和400 (Bad Request) 錯誤。當時是這麼寫的:
後臺是使用的SpringMVC的@RequestBody註解:
public @ResponseBody Map<String,Object> test(@RequestBody Map<String, Object> map){
...
}
前臺angularJs的是如此:
var data=['abc',123'];
$http.post(url,data).success( function(data) {..}
然而在提交數據的時候報錯 415 (Unsupported Media Type)
當發生 415 錯誤時首先確認項目中是否導入了Jackson的一系列jar包(本文已經導入,就不在討論)。
仔細一查,發現是請求文本類型
Content-Type:
application/x-www-form-urlencoded
的問題,不是我們需要的 application/json 如下:
所以換了另一種提交方式 :
var data=['abc',123'];
$http({
method : 'POST',
url : url,
data : data,
headers : {
'Content-type' : 'application/json;charset=UTF-8'
}
}).success( function(data) {...}
然而這樣的確不報 415 錯誤了,可是卻報了400 (Bad Request) 錯誤。這就懵逼了,這時又檢查了請求的信息:看着也沒啥不對的啊,爲啥就是報錯了呢。
後來明白了,原來angularJs的transformRequest會幫你把數據進行處理,所以重新設置一下就可以成功提交了:
$http({
method : 'POST',
url : url,
data : data,
headers : {
'Content-type' : 'application/json;charset=UTF-8'
},
transformRequest : function(obj) {
return angular.toJson(obj);
}
}).success( function(data) {...}
到這裏就完全可以解決400和415的錯誤了。
如果到這裏還是出現 415 錯誤時就要考慮是不是沒有導入@RequestBody和@ResponseBody所依賴的JacksonJar包了
核心包分別是:
jackson-annotations.jar,jackson-core.jar,jackson-databind.jar, jackson-mapper-asl.jar
導入項目就可以了
希望文章可以幫助到其他博友。