REST:Representational State Transfer,就是表现层状态转换。
可从三个方面去理解REST:
HTTP虽然是无状态协议,但是存在多种动作(请求方式),可用HTTP的多种动作对应资源的状态转换。
HTTP的多种动作(请求方式):GET、POST、PUT、DELETE。
其实HTTP动作(请求方式)还有以下不常用的动作:
假设存在实体类Word(单词类),有三个字段:id,english,chinese。
那么使用Restful风格URL对word数据进行增删改查:
GET /word # 访问(获取)word列表
GET /word/5 # 访问(获取)id为5的word数据
POST /word # 新建(添加)一个word
PUT /word # 更新(修改)一个word
DELETE /word/12 # 删除id为12的word数据
可看出Restful风格URL的一个特性:使用请求方式区分CRUD,使得URL中避免出现动词,便于统一与拓展。
当参数比较少时(1到3个),考虑采用URI传参。
当参数比较多时,考虑采用JSON格式传参。
其中URI传参的建议:
不建议这样: PUT /word?english=water&chinese=水
而建议这样: PUT /word/{english}/{chinese}
Springboot中在控制层使用以下注解可实现REST风格:
后面截取的部分代码和完整的控制器代码中都会用到这些注解。
请求路径 :/Word,请求方法:POST
前端以JSON格式提交参数,@RequestBody注解将其解析为Word类的对象,后面再去操作word即可。
//1. 添加单词信息
@RequestMapping(value = "/Word", method = RequestMethod.POST)
public Map<String, Object> insert(@RequestBody Word word) {
result = new HashMap<>();
//省略
//省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
//省略
return result;
}
请求路径 :/Word/{id},在URI里传递参数id,请求方法:DELETE
将URI中的id参数取出
//2. 根据id删除单词信息
@RequestMapping(value = "/Word/{id}", method = RequestMethod.DELETE)
public Map<String, Object> delete(@PathVariable Integer id) {
result = new HashMap<>();
//省略
//省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
//省略
return result;
}
请求路径 :/Word,请求方法:PUT
前端以JSON格式提交参数,@RequestBody注解将其解析为Word类的对象,后面再去操作word即可。
//3. 更新单词信息
@RequestMapping(value = "/Word", method = RequestMethod.PUT)
public Map<String, Object> update(@RequestBody Word word) {
result = new HashMap<>();
//省略
//省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
//省略
return result;
}
根据id查询单词信息:
请求路径 :/Word/{id},在URI里传递参数id,请求方法:PUT
将URI中的id参数取出
查询所有单词:
请求路径 :/Word,无参数,请求方法:PUT
//4. 根据id查询单词信息
@RequestMapping(value = "/Word/{id}", method = RequestMethod.GET)
public Map<String, Object> getOne(@PathVariable Integer id) {
result = new HashMap<>();
//省略
//省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
//省略
return result;
}
//5. 查询所有单词
@RequestMapping(value = "/Word", method = RequestMethod.GET)
public Map<String, Object> getAll() {
result = new HashMap<>();
//省略
//省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
//省略
return result;
}
在类上使用注解
package com.piao.springboot_rest.controller;
import com.piao.springboot_rest.entity.Word;
import com.piao.springboot_rest.mapper.WordMapper;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
//RestController=@Controller+@ResponseBoby
@RestController
public class MyRestController {
//存储预返回页面的结果对象
private Map<String, Object> result;
//注入业务对象
@Resource
private WordMapper wordMapper;
//1. 添加单词信息
@RequestMapping(value = "/Word", method = RequestMethod.POST)
public Map<String, Object> insert(@RequestBody Word word) {
result = new HashMap<>();
//数据校验 判空!
if (null == word) {
result.put("message", "插入的单词为空");
return result;
}
if (null == word.getChinese() || "".equals(word.getEnglish())) {
result.put("message", "插入的单词中文为空或者为空字符串");
return result;
}
if (null == word.getChinese() || "".equals(word.getChinese())) {
result.put("message", "插入的单词中文为空或者为空字符串");
return result;
}
wordMapper.insert(word);
result.put("message", "插入单词成功");
return result;
}
//2. 根据id删除单词信息
@RequestMapping(value = "/Word/{id}", method = RequestMethod.DELETE)
public Map<String, Object> delete(@PathVariable Integer id) {
result = new HashMap<>();
//数据校验 判空!
if (null == id) {
result.put("message", "输入的单词id为空");
return result;
}
wordMapper.deleteById(id);
result.put("message", "删除单词成功");
return result;
}
//3. 更新单词信息
@RequestMapping(value = "/Word", method = RequestMethod.PUT)
public Map<String, Object> update(@RequestBody Word word) {
result = new HashMap<>();
//数据校验 判空!
if (null == word.getId()) {
result.put("message", "更新的单词id为空");
return result;
}
if (null == word.getEnglish() || "".equals(word.getEnglish())) {
result.put("message", "更新的单词中文为空或者为空字符串");
return result;
}
if (null == word.getChinese() || "".equals(word.getChinese())) {
result.put("message", "更新的单词中文为空或者为空字符串");
return result;
}
wordMapper.updateById(word);
result.put("message", "更新单词成功");
return result;
}
//4. 根据id查询单词信息
@RequestMapping(value = "/Word/{id}", method = RequestMethod.GET)
public Map<String, Object> getOne(@PathVariable Integer id) {
result = new HashMap<>();
//数据校验 判空!
if (null == id) {
result.put("message", "传入id为空");
return result;
}
result.put("word", wordMapper.selectById(id));
result.put("message", "查询单词成功");
return result;
}
//5. 查询所有单词
@RequestMapping(value = "/Word", method = RequestMethod.GET)
public Map<String, Object> getAll() {
result = new HashMap<>();
//selectList(null)设置过滤条件为空,就是查询所有,并以list形式返回
result.put("word", wordMapper.selectList(null));
result.put("message", "查询所有单词成功");
return result;
}
}
均使用postman软件测试:
记得选择POST请求方式,参数为JSON格式
id参数在URI中,DELETE请求,下面的截图中为删除id为5566的单词信息:
参数为JSON格式,请求方式PUT
根据id查询单词信息:参数id在URI中,GET请求:下面截图例子为查询id为8的单词数据
查询所有单词:无参数,GET请求
整个REST的demo代码使用SpringBoot+MyBatisPlus+MySQL构成链接:springboot_rest demo