1. 程式人生 > >@RequestBody之後AJAX請求總是報400/415錯誤的解決辦法

@RequestBody之後AJAX請求總是報400/415錯誤的解決辦法

最近做專案時遇到這麼個問題;

後臺框架是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)

以上是我解決這個問題的辦法,如有大神有更好的解決辦法,請指教哈!