REST概述

什么是REST

  1. 一种软件架构风格
  2. 资源在网络中以某种表现形式进行状态转移
  3. 一种组织Web服务的架构
  4. 目标是为了创建具有良好扩展性的分布式系统

核心原则

  • 无状态性(Statelessness) :服务器端不保存客户端的状态信息

  • 资源导向(Resource-Orientation) :将系统的功能抽象为资源的集合,并通过唯一的标识符(URI)来访问和操作这些资源

  • 统一接口(Uniform Interface) :使用统一的接口规范来定义资源的操作方式

  • 分层系统(Layered System):将网络中的组件分为多个层次,每个层次都只关注自己的功能

  • 可缓存(Cacheable) :使用缓存来改善系统的性能和可伸缩性。服务器可以通过在响应中添加Cache-Control头部来指示响应是否可以被缓存。

优缺点

  • 优点
  1. 书写简化
  2. 可扩展性
  3. 可移植性
  4. 可测试性
  5. 隐藏了资源的访问行为
  • 缺点
  1. 无状态约束
  2. 标准化程度不足
  3. 性能问题
  4. 缺乏灵活性

具体使用

  1. 使用行为动作区分对资源的操作
  • GET (查询)
  • POST (新增)
  • DELETE (删除)
  • PUT (修改)
  1. 描述模块通常使用复数,加s

  2. 常用注解

  • @ResstController 取代Controller和ResponseBody,表示启用REST风格
  • @RequestParam用于接收url地址传参或表单传参 ?后面的
  • @RequestBody用于接收json数据
  • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
  1. 具体使用

后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
采用RESTfu1进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

  1. 入门案例
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
package com.itheima.controller;

import com.itheima.domain.Book;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

//统一每一个控制器方法返回值
@RestController
@RequestMapping("/books")
public class BookController {

@Autowired
private BookService bookService;

@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
}

@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
}

@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
}

@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
Book book = bookService.getById(id);
Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
String msg = book != null ? "" : "数据查询失败,请重试!";
return new Result(code,book,msg);
}

@GetMapping
public Result getAll() {
List<Book> bookList = bookService.getAll();
Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
String msg = bookList != null ? "" : "数据查询失败,请重试!";
return new Result(code,bookList,msg);
}
}

  1. 一般会定义一个Result类,统一数据返回结果,设置统一数据返回结果编码,code也可以自己设置成常量的形式
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
package com.sky.result;

import lombok.Data;

import java.io.Serializable;

/**
* 后端统一返回结果
* @param <T>
*/
@Data
public class Result<T> implements Serializable {

private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据

public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 1;
return result;
}

public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 1;
return result;
}

public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}

}