@RequestBody之後AJAX請求總是報400/415錯誤的解決辦法
阿新 • • 發佈:2019-02-11
最近做專案時遇到這麼個問題;
後臺框架是java的SSM;前端是B/S,安卓、IOS;
當我僅僅使用@RequestMapping時:
移動端只能通過get傳輸,post傳輸時接受不到引數值;PC端無誤;
當我加上@RequestBody時:
移動端可以通過post傳輸,但是PC端總是報錯400和415;
百度和谷歌了很久,各種方案都嘗試過了,均失敗;
我手動將表單資料轉成json字串,如下
function arrayTOjson(node) {
var b = "{";
for (var i = 0; i < node.length; i++) {
b = b + "\"" + node[i].name + "\":\"" + node[i].value + "\",";
}
b = b.substring(0, b.length - 1) + "}";
return b;
};
$.ajax({
……
contentType: "application/json; charset=utf-8",
data: arrayTOjson($("#loginFormId").serializeArray()),
……
)}
但是依然失敗;
經過多次嘗試,包括增加PC通道、xml配置等等,均已失敗告終,但也皇天不負有心人啊,最終是解決了;
**
解決辦法其實很簡單:在ajax增加自定義請求頭,修改後的ajax如下:
**
function arrayTOjson(node) {
var b = "{";
for (var i = 0; i < node.length; i++) {
b = b + "\"" + node[i].name + "\":\"" + node[i].value + "\",";
}
b = b.substring(0, b.length - 1) + "}";
return b;
};
$.ajax({
……
data: arrayTOjson($("#loginFormId" ).serializeArray()),
headers: {
"content-Type":"application/json",
},
……
)}
**這樣做有一個缺陷:就是data不允許空;就算不需要傳參的,也需要拼一個無關痛癢的引數,否則依然報錯;
其實這種介面一般都沒有敏感資訊,可以去掉後臺的@RequestBody,移動端就採用get方式;**
方案二:
這種解決辦法脫離了ajax提交表單了,而是使用XMLHttpRequest物件代替ajax,如果不侷限於ajax的話可以參考下,結構如下:
var xhr = new XMLHttpRequest();
var url ="";
var data = JSON.stringify({
"page": 0,
"limit": 20,
"shopId": 1,
"timeType": 3,
});
xhr.open("POST", url );
xhr.setRequestHeader('Content-Type','application/json');
xhr.onload = function(){
//回撥
console.log(xhr.responseText)
}
xhr.send(data)
以上是我解決這個問題的辦法,如有大神有更好的解決辦法,請指教哈!