zoukankan      html  css  js  c++  java
  • 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来处理)。
  • 相关阅读:
    Windows徽标键(WinKey)的屏蔽和恢复
    合肥轨道交通线路图(2025+ / 运营版)
    cmake未找到命令解决
    python3 用requests.get获取网页内容为空 <Response [200]>
    磁盘问题修复
    双机热备vrrp
    华为 nat策略
    策略实验2
    防火墙安全策略
    华为防火墙策略配置(http、icmp包允许通过)
  • 原文地址:https://www.cnblogs.com/lwx521/p/9855891.html
Copyright © 2011-2022 走看看