RESTful风格的应用

2022-09-23 11:44:16 浏览数 (1)

RESTful应用

REST-表现层状态转换,资源在网络中以某种表现形式进行状态转移

RESTfl -是基于REST理念的一套开发风格,是具体的开发规则

RESTful开发规范

  • 使用URL作为用户交互入口
  • 明确的语义规范(GET|POST|PUT|DELETE)
  • 只返回数据(JSON|XML),不包含任何展现

RESTful命名要求

RESTful基本使用

RESTful实验室

代码语言:javascript复制
@Controller
@RequestMapping("/restful")
public class RestfulController {
    @GetMapping("/request")
    @ResponseBody
    public String doGetRequest() {
        return "{"message":"返回查询结果"}";
    }

    @PostMapping("/request")
    @ResponseBody
    public String doPostRequest() {
        return "{"message":"数据新建成功"}";
    }

    @PutMapping("/request")
    @ResponseBody
    public String doPutRequest() {
        return "{"message":"数据更新成功"}";
    }

    @DeleteMapping("/request")
    @ResponseBody
    public String doDeleteRequest() {
        return "{"message":"数据删除成功"}";
    }
}
代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script>
    <script>
        $(function () {
            $("#btnGet").click(function () {
                $.ajax({
                    url:"/restful/request",
                    type:"get",
                    dataType:"json",
                    success: function (json) {
                        $("#message").text(json.message);
                    },
                })
            });
        })
        ...
    </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请求">
<h2 id="message"></h2>
</body>
</html>

RestController注解与路径变量

@RestController:简化开发过程。不需要在方法上额外添加@ResponseBody

代码语言:javascript复制
//路径变量:存储在URI中的可变的值
@PostMapping("/request/{rid}")
public String doPostRequest(@PathVariable("rid") Integer requestId) {
    return "{"message":"数据新建成功","id":"   requestId   "}";
}

简单请求与非简单请求

  • 简单请求是指标准结构的HTTP请求,对应GET/POST请求
  • 非简单请求时复杂要求的HTTP请求,值PUT/DELETE、扩展标准请求
  • 两者最大区别是非简单请求发送前需要发送预检请求
非简单请求

SpringMVC需要增加一个过滤器才能接收PUT/DELETE请求

代码语言:javascript复制
<filter>
    <filter-name>formContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>formContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

JSON序列化

返回实体对象,同时有@RestController或增加了@ResponseBody,自动的通过配置的Jackson对实体对象进行序列化

1.添加依赖
代码语言:javascript复制
<!--核心-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.2</version>
</dependency>
<!--数据绑定-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>
<!--注解-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.3</version>
</dependency>
2.方法定义时不在返回String而是返回实例化对象
代码语言:javascript复制
@GetMapping("/person")
// 返回实体对象,同时有@RestController或增加了@ResponseBody,自动的通过配置的Jackson对实体对象进行序列化
public Person findByPersonId(Integer id) {
    Person p = new Person();
    if (id == 1) {
        p.setName("lily");
        p.setAge(23);
    } else if (id == 2) {
        p.setName("Jack");
        p.setAge(22);
    }
    return p;
}
3.日期类型转换

在使用日期类型时添加@JsonFormat()注解进行格式化输出,要指明输出格式还有时区的偏差

跨域问题

  • 同源策略:阻止从一个域加载的脚本去获取另一个域上的资源
  • 只要协议、域名、端口有任何一个不同,都被当作是不同的域
  • 浏览器Console看到Access-Control-Allow-Orgin就代表跨域了

SpringMVC跨域访问

  • CORS是一种机制,使用额外的HTTP头通知浏览器可以访问其他域
  • URL响应头包含 Access-Control-* 指明请求允许跨域

@CrossOrigin - Controller跨域注解

代码语言:javascript复制
//多域名跨域
@CrossOrigin(origins = "{http://localhost:8080,http://www.huazll.cn}")

<mvc:cors> - SpringMVC全局跨域配置

代码语言:javascript复制
<mvc:cors>
    <mvc:mapping path="/restful/**" allowed-origins="http://localhost:8080,http://www.huazll.cn" max-age="3600"/>
</mvc:cors>

0 人点赞