• Java框架(七)-- RESTful风格的应用(2)--简单请求与非简单请求、JSON序列化


    简单请求与非简单请求

    简单请求是指标准结构的HTTP请求,对应GET/POST请求。
    非简单请求是复杂要求的HTTP请求,指PUT/DELETE、扩展标准请求。
    两者最大区别是非简单请求发送前需要发送预检请求
    在这里插入图片描述
    我们修改client.html的post和put请求js部分

                $("#btnPost").click(function (){
                    $.ajax({
                        url:"/restful/request/100",
                        type:"post",
                        data:"name=lily&age=23",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message+":"+json.id);
                        }
                    })
                })
                $("#btnPut").click(function (){
                    $.ajax({
                        url:"/restful/request",
                        type:"put",
                        data:"name=lily&age=23",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message);
                        }
                    })
                })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在com.ql.restful.entity包下创建Person实体类

    package com.ql.restful.entity;
    
    public class Person {
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    然后修改RestfulController

    package com.ql.restful.controller;
    
    import com.ql.restful.entity.Person;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/restful")
    public class RestfulController {
        @GetMapping("request")
    //    @ResponseBody
        public String doGetRequest(){
            return "{\"message\":\"返回查询结果\"}";
        }
    
        @PostMapping("request/{rid}")
    //    @ResponseBody
        public String doPostRequest(@PathVariable("rid") Integer requestId, Person person){
            System.out.println(person.getName()+":"+person.getAge());
            return "{\"message\":\"数据新建成功\",\"id\":"+requestId+"}";
        }
    
        @PutMapping("request")
    //    @ResponseBody
        public String doPutRequest(Person person){
            System.out.println(person.getName()+":"+person.getAge());
            return "{\"message\":\"数据更新成功\"}";
        }
    
        @DeleteMapping("request")
    //    @ResponseBody
        public String doDeleteRequest(){
            return "{\"message\":\"数据删除成功\"}";
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    运行依次测试post、put请求
    在这里插入图片描述
    发现put请求并没能接收到参数。
    SpringMVC最早的时候是对网页服务的,默认网页表单提交时只支持简单请求(get、post请求)。随着技术的演进,也需要考虑put、delete请求,SpringMVC提供了额外的表单内容过滤器,来对put、delete请求额外处理。

    在web.xml文件中添加FormContentFilter过滤器配置

        <filter>
            <filter-name>formContentFilterfilter-name>
            <filter-class>org.springframework.web.filter.FormContentFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>formContentFilterfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后重启项目再测试
    在这里插入图片描述
    post和put请求都能接收到参数了。

    JSON序列化

    打开项目pom.xml引入jackson依赖(注意使用2.10.x以上版本,2.x < 2.9.10.8版本存在反序列化漏洞)

            <dependency>
                <groupId>com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-coreartifactId>
                <version>2.12.6version>
            dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-databindartifactId>
                <version>2.12.6version>
            dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-annotationsartifactId>
                <version>2.12.6version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    SpringMVC非常的智能,它会检测当前类路径一旦存在jackson相关包,会自动提供JSON序列化服务,不需要额外配置。
    然后打开com.ql.restful.controller包下RestfulController类添加方法

        @GetMapping("/person")
        public Person findByPersonId(Integer id){
            Person person = new Person();
            if(id==1){
                person.setName("lily");
                person.setAge(23);
            }else if(id==2){
                person.setName("smith");
                person.setAge(22);
            }
            return person;
        }
    
        @GetMapping("/persons")
        public List<Person> findPersons(){
            List list = new ArrayList();
            Person person1 = new Person();
            person1.setName("lily");
            person1.setAge(23);
            list.add(person1);
            Person person2 = new Person();
            person2.setName("smith");
            person2.setAge(22);
            list.add(person2);
            return list;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    当方法返回实体对象或集合,且有@ResponseBody注解时,SpringMVC会自动通过jackson对实体对象或集合进行序列化输出。
    运行项目,在浏览器地址栏中输入http://localhost:8080/restful/person?id=1
    在这里插入图片描述
    在浏览器地址栏中输入http://localhost:8080/restful/persons
    在这里插入图片描述
    修改src/main/webapp/client.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>RESTful实验室title>
        <script src="jquery-3.6.0.min.js">script>
        <script>
            $(function (){
                $("#btnGet").click(function (){
                    $.ajax({
                        url:"/restful/request",
                        type:"get",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message);
                        }
                    })
                })
                $("#btnPost").click(function (){
                    $.ajax({
                        url:"/restful/request/100",
                        type:"post",
                        data:"name=lily&age=23",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message+":"+json.id);
                        }
                    })
                })
                $("#btnPut").click(function (){
                    $.ajax({
                        url:"/restful/request",
                        type:"put",
                        data:"name=lily&age=23",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message);
                        }
                    })
                })
                $("#btnDelete").click(function (){
                    $.ajax({
                        url:"/restful/request",
                        type:"delete",
                        dataType:"json",
                        success:function (json){
                            $("#message").text(json.message);
                        }
                    })
                })
    
                $("#btnPersons").click(function (){
                    $.ajax({
                        url:"/restful/persons",
                        type: "get",
                        dataType: "json",
                        success: function (json){
                            for(let i=0; i<json.length; i++){
                                $("#divPersons").append("

    "+json[i].name+"-"+json[i].age+"

    "
    ); } } }) }) })
    script> head> <body> <input type="button" id="btnGet" value="发送Get请求"> <input type="button" id="btnPost" value="发送Post请求"> <input type="button" id="btnPut" value="发送Put请求"> <input type="button" id="btnDelete" value="发送Delete请求"> <h1 id="message">h1> <hr/> <input type="button" id="btnPersons" value="查询所有人员"> <div id="divPersons">div> body> html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    运行工程,点击查询所有人员测试
    在这里插入图片描述
    jackson对时间格式默认支持的不是特别理想。

    在Person实体类中添加时间格式属性

    package com.ql.restful.entity;
    
    import java.util.Date;
    
    public class Person {
        private String name;
        private Integer age;
        private Date birthday;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    然后修改RestfulController中的findPersons方法

        @GetMapping("/persons")
        public List<Person> findPersons(){
            List list = new ArrayList();
            Person person1 = new Person();
            person1.setName("lily");
            person1.setAge(23);
            person1.setBirthday(new Date());
            list.add(person1);
            Person person2 = new Person();
            person2.setName("smith");
            person2.setAge(22);
            person2.setBirthday(new Date());
            list.add(person2);
            return list;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    修改src/main/webapp/client.html中的查询所有人员按钮点击事件js

                $("#btnPersons").click(function (){
                    $.ajax({
                        url:"/restful/persons",
                        type: "get",
                        dataType: "json",
                        success: function (json){
                            for(let i=0; i<json.length; i++){
                                $("#divPersons").append("

    "+json[i].name+"-"+json[i].age+"-"+json[i].birthday+"

    "
    ); } } }) })
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    再次运行工程测试
    在这里插入图片描述
    得知默认展示为时间戳,为了解决这个问题,jackson提出相应注解,修改Person实体类

    package com.ql.restful.entity;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    
    import java.util.Date;
    
    public class Person {
        private String name;
        private Integer age;
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date birthday;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    重新运行工程,时间显式正常
    在这里插入图片描述

  • 相关阅读:
    R语言回归及混合效应模型及贝叶斯实现
    一种便捷的爬虫方法
    云计算的三大服务模式:IaaS、PaaS、SaaS的深入解析
    LeetCode-891. 子序列宽度之和【排序,数学,数组】
    前端基础建设与架构30 实现高可用:使用 Puppeteer 生成性能最优的海报系统
    Python 实现动态动画心形图
    java毕业生设计宠物店管理系统计算机源码+系统+mysql+调试部署+lw
    【华为OD机试真题 JS】根据某条件聚类最少交换次数
    抓包工具简单介绍和 fiddler 安装
    LeetCode220828_89、数组中的第K个最大元素
  • 原文地址:https://blog.csdn.net/qq_32091929/article/details/126526241