Restful风格
Restful风格
REST即Representational state transfer(表述性状态转移),是一种Web服务的设计风格和开发方式,基于HTTP协议,可以使用XML格式或者JSON格式,是一种轻量级,跨平台,跨语言的架构设计。
1 为什么使用Restful风格
1.1 传统开发模式
在传统开发模式的Web应用中,前端写好静态的HTML页面交给后端,后端把HTML渲染或者重定向到前端界面。这样前端页面看到的效果都是由后端控制的,即后端需要控制前端的展示。
传统开发模式带来的问题
- 前后端耦合严重,前端页面会嵌入后端代码,导致代码混乱,难以维护
- 开发人员需要前后端兼顾,开发效率低,开发周期长
- 开发出的软件响应速度慢,用户体验差
- 与前端开发人员沟通协作成本高,前后端开发进度相互影响
1.2 前后端分离模式
前后端分离模式是Web应用的一种架构模式,在开发阶段,前后端人员约定好数据交互接口,即可并行开发与测试。前端开发完成可以独自进行mock测试,后端也可以使用postman等接口测试工具进行功能测试,最后前后端协同进行功能联调测试。
前后端分离模式的核心是后端开发给前端提供接口,前端调用后端提供的REST风格接口获得数据完成页面设计和渲染。即后端提供数据,前端负责显示。
前后端分离模式的优势
- 实现前后端解耦,前后端可以并行开发与测试,提供开发效率
- 前后端代码解耦,增强代码可维护性
- 异步请求的方式,可以很好的应对复杂多变的前端需求
- 减少后端服务器的并发压力,提高系统性能
2 Rest架构主要原则
- 网络上的所有事物都被抽象为资源
- 每个资源都有唯一的资源标识符
- 同一个资源具有多种表现形式(xml, json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
3 请求方式
HTTP方法 | 资源操作 | 幂等性 | 安全性 | 含义 |
---|---|---|---|---|
GET | SELECT | Yes | Yes | 从服务器取出资源(一个或多个) |
POST | INSERT | No | No | 在服务器新建一个资源 |
PUT | UPDATE | Yes | No | 在服务器更新资源 |
DELETE | DELETE | Yes | No | 从服务器删除资源 |
- 幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。
- 安全性:对REST接口的访问,不会使服务器资源的状态发生改变。
3.1 传统风格请求方式
- GET http://127.0.0.1/user/query/{id} 根据 id 查询用户数据
- POST http://127.0.0.1/user/save 新增用户
- POST http://127.0.0.1/user/update 修改用户信息
- GET/POST http://127.0.0.1/user/delete/{id} 删除用户信息
3.2 REST风格请求方式
- GET http://127.0.0.1/user/{id} 根据 id 查询用户数据
- POST http://127.0.0.1/user 新增用户
- PUT http://127.0.0.1/user 修改用户信息
- DELETE http://127.0.0.1/user 删除用户信息
传统的请求方式每次的请求地址,都在描述当前请求的动作,如查询的时候请求地址用了query
,添加的时候请求地址用了save
等等;这个描述其实没有必要,使用GET请求就表示了查询,POST请求就表示新增;这也是为什么使用restful风格。
4 Springboot中的Restful风格
- @RestController = @Controller + @ResponseBody
- @GetMapping = @RequestMapping(method = RequestMethod.GET)
package com.lzy.springboot_study.controller;
import com.lzy.springboot_study.dao.DepartmentDao;
import com.lzy.springboot_study.entity.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author LiZY
* @create 2021-06-03 20:53:59
*/
@RestController
public class DepartmentController {
@Autowired
DepartmentDao departmentDao;
@GetMapping("/departments")
public List<Department> getDepartments() {
return departmentDao.getDepartments();
}
@GetMapping("/departments/{id}")
public Department getDepartmentById(@PathVariable("id") int id) {
return departmentDao.getDepartmentById(id);
}
}
5 参考文章
[1] Restful风格详解