restful风格
表现层状态转换(英语:Representational State Transfer,缩写:REST)是Roy Thomas Fielding博士于2000年在他的博士论文[1]中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。表现层状态转换是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为 REST 或 RESTful)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。因此表现层状态转换提供了在互联网络的计算系统之间,彼此资源可交互使用的协作性质(interoperability)。相对于其它种类的网络服务,例如SOAP服务,则是以本身所定义的操作集,来访问网络上的资源。
restful要点与标准
要点
需要注意的是,REST是设计风格而不是标准。REST通常基于HTTP、URI、XML以及HTML这些现有的广泛流行的协议和标准。
- 资源是由URI来指定。
- 对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式则是XML或者HTML,取决于读者是机器还是人、是消费Web服务的客户软件还是Web浏览器。当然也可以是任何其他的格式,例如JSON。
可重新表达的状态迁移的特征
- 统一接口(Uniform Interface)
- 以资源为基础
每个资源都可以通过URI访问到。
也就是一个个可以认知的资源,比如文档,音乐,视频等信息,都可以通过唯一的URI确定
- 通过重表达的客户端可以管理原资源
就是我们通过客户端可以修改原资源的状态
- 返回信息足够描述自己
这样重表达的客户端可以知道如何处理
- 超媒体是应用状态的引擎
处理以超媒体为基础的状态变化
- Stateless
无状态 - Cacheable
可缓存 - Client-Server
客户服务器分离模式,任何一个客户端与服务器都是可替换的 - Layered System
分层的系统,客户端不知道他联系的是不是最终服务器 - Code on Demand (optional)
服务器可以将能力扩展到客户端,如果客户端可以执行的话。这个功能是可选择的。
HTTP请求方法在RESTful API中的典型应用
springboot 实现restful风格开发
GET请求主要用于获取资源
- 可以利用GET请求通过传入参数获取用户列表或者某一用户
@RequestMapping(value = "/find/{current}", method = RequestMethod.GET)
public RestResponse findAllUser(@PathVariable int current){
// current = 1;
int size = 5;
Page<User> page = new Page<>(current,size);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("id");
Page<User> userPage = (Page<User>) userMapper.selectPage(page, null);
if (userPage != null){
return RestResponse.success(userPage);
}else {
return RestResponse.fail("查询不到数据");
}
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public RestResponse findUserByID(@PathVariable Long id){
User user = userMapper.selectById(id);
if (user != null){
return RestResponse.success(user);
}else {
return RestResponse.fail("查询不到数据");
}
}
POST请求主要用于创建资源
- 我们可以利用 http POST请求来创建资源,用于保存用户信息到数据库中去
@RequestMapping(value = "/save", method = RequestMethod.POST)
public RestResponse saveUser(@RequestBody User user){
int insert = userMapper.insert(user);
if (insert == 1){
return RestResponse.success("插入数据成功");
}else {
return RestResponse.fail("插入数据失败");
}
}
PUT请求主要用来更新资源
- 我们可以利用jttp PUT请求来更新现有资源,完成用户信息更新
@RequestMapping(value = "/update", method = RequestMethod.PUT)
public RestResponse updateUser(@RequestBody User user){
User updateUser = userMapper.selectById(user.getId());
if (updateUser != null){
updateUser.setName(user.getName());
updateUser.setEmail(user.getEmail());
updateUser.setAge(user.getAge());
int insert = userMapper.updateById(updateUser);
if (insert == 1){
return RestResponse.success("更新数据成功");
}else {
return RestResponse.fail("更新数据失败");
}
}else {
return RestResponse.fail("更新数据失败");
}
}
DELETE请求主要用于删除资源
- 我们可以通过使用DELETE请求来对不需要的用户信息进行处理
@RequestMapping(value = "/delete/{id}", method = {RequestMethod.DELETE, RequestMethod.GET})
public RestResponse delUserById(@PathVariable Long id){
int del = userMapper.deleteById(id);
if (del == 1){
return RestResponse.success("删除成功");
}else {
return RestResponse.fail("删除失败");
}
}
如果想在浏览器中使用
DELETE
请求,需要在method
方法参数中进行相关请求设置:method = {RequestMethod.DELETE, RequestMethod.GET}
完整示例
package mybatis_plus.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import mybatis_plus.entity.User;
import mybatis_plus.mapper.UserMapper;
import mybatis_plus.utils.RestResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author heroMps
* @since 2021-02-23
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private UserMapper userMapper;
@RequestMapping(value = "/find/{current}", method = RequestMethod.GET)
public RestResponse findAllUser(@PathVariable int current){
// current = 1;
int size = 5;
Page<User> page = new Page<>(current,size);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("id");
Page<User> userPage = (Page<User>) userMapper.selectPage(page, null);
if (userPage != null){
return RestResponse.success(userPage);
}else {
return RestResponse.fail("查询不到数据");
}
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public RestResponse findUserByID(@PathVariable Long id){
User user = userMapper.selectById(id);
if (user != null){
return RestResponse.success(user);
}else {
return RestResponse.fail("查询不到数据");
}
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public RestResponse saveUser(@RequestBody User user){
int insert = userMapper.insert(user);
if (insert == 1){
return RestResponse.success("插入数据成功");
}else {
return RestResponse.fail("插入数据失败");
}
}
@RequestMapping(value = "/update", method = RequestMethod.PUT)
public RestResponse updateUser(@RequestBody User user){
User updateUser = userMapper.selectById(user.getId());
if (updateUser != null){
updateUser.setName(user.getName());
updateUser.setEmail(user.getEmail());
updateUser.setAge(user.getAge());
int insert = userMapper.updateById(updateUser);
if (insert == 1){
return RestResponse.success("更新数据成功");
}else {
return RestResponse.fail("更新数据失败");
}
}else {
return RestResponse.fail("更新数据失败");
}
}
@RequestMapping(value = "/delete/{id}", method = {RequestMethod.DELETE, RequestMethod.GET})
public RestResponse delUserById(@PathVariable Long id){
int del = userMapper.deleteById(id);
if (del == 1){
return RestResponse.success("删除成功");
}else {
return RestResponse.fail("删除失败");
}
}
}