21.@RequestBody和@ResponseBody

1.@ResponseBody
1.@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中一般在异步获取数据时使用【也就是AJAX】
2.在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中
3.比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据
    测试代码:
        @ResponseBody---->方法上添加该标签,结果不会进行路径拼串和跳转,一般用于ajax获取返回的json报文,会自动的将返回对象格式化为json对象,前提是导入jackson的包!
        @RequestMapping("/getPersonList")
        public List<Person> getpersonList(Book book){
            System.out.println("请求体:"+book);
            Person P1=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
            Person P2=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
            Person P3=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
            Person P4=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
            List<Person> list=new ArrayList<>();
            list.add(P1);
            list.add(P2);
            list.add(P3);
            list.add(P4);
            return list;
        }
    jackson的pom文件如下
         <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.0</version>
        </dependency>

 

@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,
封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上

测试代码如下:
    1.传入的是json对象
        前端代码如:
            $(function () {
                $("#button").click(function () {
                    var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
                    $.ajax({
                        url: "/getPersonList",
                        data: emp,----------->此处传入的是json对象,后台代码参数上不用加@RequestBody也可以正常获取到请求参数并格式化为javabean
                        type:"post",--------->无论get/post请求都可以,ajax默认是get请求
                        success: function (data) {
                            console.log(data)
                        }
                    })
                })
            })
        后端代码如下:
                @RequestMapping("/getPersonList")
                public List<Person> getpersonList(Book book){
                    System.out.println("请求体:"+book);
                }
    
    2.传入的是json字符串:
        $("#button").click(function () {
                var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
                var requestJson = JSON.stringify(emp);------>将json对象格式化为json字符串
                $.ajax({
                    url: "/getPersonList",
                    data: emp,
                    type:"get",
                    contentType:"application/json",--------->必须加上这行,否则后台会报解析错误
                    success: function (data) {
                        console.log(data)
                    }
                })
            })
        后台代码如下:
            @RequestMapping("/getPersonList")
            public List<Person> getpersonList(@RequestBody Book book){-->参数上加上@RequestBody,会将前台传来的json字符串自动格式化为javabean
                System.out.println("请求体:"+book);
            }

 

3.HttpEntity可以获取请求体外,还可以获取到请求头中的所有消息
用法:
    前端:
        $("#button").click(function () {
            var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
            var requestJson = JSON.stringify(emp);
            $.ajax({
                url: "/getPersonList",
                data: requestJson,--------->这里必须是json字符串
                type:"post",--------------->必须是post请求
                contentType:"application/json",--->加上这句
                success: function (data) {
                    console.log(data)
                }
            })
        })
    后台:
        @RequestMapping("/getPersonList")
            public List<Person> getpersonList(HttpEntity<Book> book){
                System.out.println("请求体:"+book);
            }
            
    之前如果要获取请求头信息必须:public List<Person> getpersonList(@RequestHeader("Content-Type")String ContentType ){....}
    输出结果是:发现出了前台传的参数外还又全部的请求头信息,
        请求体:<Book{bookName='西游记', price=12.3, autor='吴承恩'},
        {host=[localhost:8080], connection=[keep-alive], content-length=[57], pragma=[no-cache], cache-control=[no-cache], accept=[*/*],
         x-requested-with=[XMLHttpRequest], user-agent=[Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36],
         origin=[http://localhost:8080], sec-fetch-site=[same-origin], sec-fetch-mode=[cors], sec-fetch-dest=[empty], referer=[http://localhost:8080/form.jsp], 
         accept-encoding=[gzip, deflate, br], accept-language=[zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7], cookie=[JSESSIONID=54BB0D8A42382EF2051979FDC7F59D61], 
         Content-Type=[application/json;charset=UTF-8]}>

posted @ 2022-05-08 22:21  努力的达子  阅读(97)  评论(0编辑  收藏  举报