ajax post請求報錯415或400解決方案


ajax post請求報錯415或400解決方案

jsp頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery-2.1.0.js"></script>
</head>
<body>
    
<button id="btn">發送ajax請求</button>
<script>

    //頁面加載事件
    $(function () {
        $("#btn").click(function () {

            //發送ajax請求
            var url = "user/testAjax";
            var params = {"username":"liangge", "password":"123", "age":18};
            $.ajax({
                url:url,
                data:params,
                type:"post",
                success:function (resultData) {
                    //成功后的回調函數
                    console.log(resultData);
                    console.log(resultData.username);
                    console.log(resultData.password);
                    console.log(resultData.age);
                },
                dataType:"json"
                
            });
        });
    });
</script>
</body>
</html>

java代碼

@Controller
@RequestMapping(path = "/user")
public class UserController {
  /**
     * 模擬異步請求和響應
     */
    @RequestMapping(path = "/testAjax",method = RequestMethod.POST)
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法執行了...");

        //瀏覽器發送ajax請求,傳的是json字符串,后端把json字符串封裝到user對象中
        System.out.println(user);

        //模擬從數據庫中查數據
        user.setUsername("張三");
        user.setPassword("456");
        user.setAge(30);
        return user;
    }
}

只要點擊 發送ajax 按鈕,就報了如下錯誤:

HTTP的狀態碼415為

415 Unsupported Media Type 服務器無法處理請求附帶的媒體格式 (不支持的媒體類型)

基本上就是跟 content-type 有關 (content-type:設置發送給服務器數據的格式)

查看一下請求頭信息

tips:

post提交數據四種常見的content-type取值:

1.application/x-www-form-urlencoded :
	最常見的 POST 提交數據的方式
2.multipart/form-data :
	使用表單上傳文件時,傳遞這個值
3.application/json :
	用來告訴服務端發送的數據是序列化后的 JSON 字符串
4.text/xml :
	使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范

所以不難發現為什么默認的是 application/x-www-form-urlencoded

也知道我們該用哪一個值了

初次修改:

<script>
    //頁面加載事件
    $(function () {
        $("#btn").click(function () {

            //發送ajax請求
            var url = "user/testAjax";
            var params = {"username":"liangge", "password":"123", "age":18};
            $.ajax({
                url:url,
                data:params,
                type:"post",
                success:function (resultData) {
                    //成功后的回調函數
                    console.log(resultData);
                    console.log(resultData.username);
                    console.log(resultData.password);
                    console.log(resultData.age);
                },
                dataType:"json",
                contentType: 'application/json;charset=UTF-8'
            });
        });
    });
</script>

但還是報錯了,報400

看下請求頭中的contentType

contentType已經修改過,為什么報400呢?

因為前后台傳入的數據不匹配,后台無法解析數據,告訴服務端數據是序列化后的 JSON 字符串,

但是JSON數據確沒有序列化或是沒有滿足JSON的格式。

所以需要對json進行序列化 ==>JSON.stringify( )

JSON.stringify( ) 后面會做簡單說明

<script>
    //頁面加載事件
    $(function () {
        $("#btn").click(function () {

            //發送ajax請求
            var url = "user/testAjax";
            var params = {"username":"liangge", "password":"123", "age":18};
            $.ajax({
                url:url,
                data:JSON.stringify(params),
              //data:'{"username":"liangge", "password":"123", "age":18}',或者這樣寫也可以,不用序列化,直接寫的規范一點
                type:"post",
                success:function (resultData) {
                    //成功后的回調函數
                    console.log(resultData);
                    console.log(resultData.username);
                    console.log(resultData.password);
                    console.log(resultData.age);
                },
                dataType:"json",
                contentType: 'application/json;charset=UTF-8'
            });
        });
    });
</script>

再試一次,控制台打印了:

testAjax方法執行了...
User{username='liangge', password='123', age=18}

控制台也輸出了數據:

OK 成功!!!


JSON.stringify() 把 JavaScript 對象轉換為字符串,對 JavaScript 對象進行字符串化

也可以用作來對json數據進行序列化

示例:

<script type="text/javascript">
    
    var obj = { name:"亮哥", age:18, city:"上海"};
    var myJSON = JSON.stringify(obj);
    console.log(myJSON); // {"name":"亮哥","age":18,"city":"上海"}

    var arr = [ "小李", "小劉", "小王" ];
    var myJSON02 =  JSON.stringify(arr);
    console.log(myJSON02); // ["小李","小劉","小王"]

</script>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM