SpringBoot @RequestBody 中文亂碼


今天突然想學習一下Restful風,詳細的我就不贅述了,我的理解是同一個請求路徑根據請求方式不同進行不同的處理

如四種提交方式,這里推薦一個插件Postman,可以模仿各種請求類型,自行百度安裝吧

GET(SELECT):從服務器查詢,可以在服務器通過請求的參數區分查詢的方式。  
POST(CREATE):在服務器新建一個資源,調用insert操作。  
PUT(UPDATE):在服務器更新資源,調用update操作。  
DELETE(DELETE):從服務器刪除資源,調用delete語句

 

下面進行實踐

前端簡易代碼

<a href="#" onclick="add()">添加</a>
<a href="#" onclick="del()">刪除</a>
<a href="#" onclick="select()">查詢</a>
<a href="#" onclick="update()">修改</a>

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
    function add(){
    var id = "111111111";
        $.ajax({
            type:"POST",
            url:"test.do",
            data:{id:"添加11111111111"}});
    }


    function del(){
   var id = "2222222";
        $.ajax({
            type:"DELETE",
            url:"test.do",
            data:{id:"刪除22222222222"},
            contentType : "text/html;charset=UTF-8",
            dataType:"json"});
    }

     function select(){
    var id = "33333";
        $.ajax({
            type:"GET",
            url:"test.do",
            data:{id:"查詢3333333333"}});
    }

     function update(){
    var id = "111111111";
        $.ajax({
            type:"PUT",
            url:"test.do",
            data:{id:"修改4444444"}});
    }
</script>

后台簡易代碼

@RequestMapping(value = "/test.do", method = RequestMethod.DELETE)
    public void test(String id){
        System.out.println("刪除");
        System.out.println(id);
    }

    @RequestMapping(value = "/test.do", method = RequestMethod.POST)
    public void test1(String id){
        System.out.println("添加");
        System.out.println(id);
    }

    @RequestMapping(value = "/test.do", method = RequestMethod.PUT)
    public void test2(String id){
        System.out.println("修改");
        System.out.println(id);
    }

    @RequestMapping(value = "/test.do", method = RequestMethod.GET)
    public void test3(String id){
        System.out.println("查詢");
        System.out.println(id);
    }

前台ajax的提交方式對應於后台@RequestMapping(value = "/test.do", method = RequestMethod.方式)

控制台:

添加
添加11111111111
2018-10-26 09:28:45.325 DEBUG 8500 --- [nio-8080-exec-4] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2
2018-10-26 09:28:45.977 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@718e55d2
刪除
null
2018-10-26 09:28:45.984 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2
2018-10-26 09:28:46.731 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@718e55d2
查詢
查詢3333333333
2018-10-26 09:28:46.734 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2
2018-10-26 09:28:47.585 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@535448c
修改
修改4444444
2018-10-26 09:28:47.590 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@535448c

可見Restful已經根據不同的提交方式進入不同的方法了,后面大家就可以自行處理了,但是還有一個問題,當提交方式為DELETE時,接收的id值為null

在參數列表中加入@RequestBody注解,這里的作用是通過@requestBody可以將請求體中的JSON字符串綁定到相應的bean上,也可以將其分別綁定到對應的字符串上。

 @RequestMapping(value = "/lll.do", method = RequestMethod.DELETE)
    public void test(@RequestBody String id){
        System.out.println("刪除");
        System.out.println(id);
    }

控制台:

2018-10-26 10:31:09.661 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@4bafd197
刪除
id=%E5%88%A0%E9%99%A422222222222
2018-10-26 10:31:09.667 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4bafd197

可以看到,是可以獲取到數據了,但是會出現中文亂碼,這個中文亂碼超級頑固,設置了很多都沒用,最后在前台這樣設置就可以了

 function del(){
   var id = "刪除sssss22222222222";
        $.ajax({
            type:"DELETE",
            url:"lll.do",
            data:JSON.stringify(id),
            contentType :"application/json",
            dataType:"json"});
    }

JSON.stringify() 方法用於將 JavaScript 值轉換為 JSON 字符串。

這樣控制台的輸出就變成了:

2018-10-26 13:42:59.585 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@343dbcb6
刪除
"刪除sssss22222222222"
2018-10-26 13:42:59.587 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@343dbcb6

 為什么參數變成字符串就不亂碼了呢?原來@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的,注意一定是字符串

這里給出JSON字符串和JSON對象的區別

JSON字符串
var data ='{"id":"刪除sssss22222222222"}';//字符串是單引號或者雙引號引起來的

JSON對象
var data ={"id":"刪除sssss22222222222"};

所有上面的JSON.stringify()還可以改成聲明成JSON字符串傳輸

JSON對象轉JSON字符串可以用JSON.stringify()方法

反過來JSON字符串轉JSON對象可以用JSON.parse()方法

$.ajax({
url : 'login.php',
type : 'post',
data : {id:id,name:name}, //這里是json對象
success : function(data){......}
)};
默認是以application/x-www-form-urlencoded方式提交。也就是常見的表單提交方式

如果使用ajax的application/json方式,記得data參數是字符串類型的。使用JSON.stringify()轉換一下

 至於什么時候用@RequestBody呢?

GET、POST方式提時, 根據request header Content-Type的值來判斷: 
application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理); 
multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據); 
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理)。

 


免責聲明!

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



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