Representational State Transfer简称:REST 直接翻译:表现层状态转移
是一种开发风格,遵从此风格开发软件,符合REST风格,则RESTFUL。
RESTful架构:
- 每一个URI代表一种资源
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"
访问标识 | 资源 |
---|---|
http://localhost:8989/xxx/users | 所有用户 |
http://localhost:8989/xxx/users/1 | 用户1 |
http://localhost:8989/xxx/users/1/orders | 用户1的所有订单 |
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
请求方式 | 标识 | 意图 |
---|---|---|
GET | http://localhost:8989/xxx/users | 查询所有用户 |
POST | http://localhost:8989/xxx/users | 在所有用户中增加一个 |
PUT | http://localhost:8989/xxx/users | 在所有用户中修改一个 |
DELETE | http://localhost:8989/xxx/users/1 | 删除用户1 |
GET | http://localhost:8989/xxx/users/1 | 查询用户1 |
GET | http://localhost:8989/xxx/users/1/orders | 查询用户1的所有订单 |
POST | http://localhost:8989/xxx/users/1/orders | 在用户1的所有订单中增加一个 |
- ?limit=10:指定返回记录的数量
- ?offset=10:指定返回记录的开始位置。
- ?page=2&limit=100:指定第几页,以及每页的记录数。
- ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
- ?animal_type_id=1:指定筛选条件
- GET /collection:返回资源对象的列表(数组)
- GET /collection/resource:返回单个资源对象
- POST /collection:返回新生成的资源对象
- PUT /collection/resource:返回完整的资源对象
- PATCH /collection/resource:返回完整的资源对象
- DELETE /collection/resource:返回一个空文档
@RequestMapping(value = “/users”,method = RequestMethod.GET)
等价
@GetMapping(“/users”)
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping
public DataResult getAll(Integer pageNum,Integer limit){
System.out.println("查询所有user"+"...."+pageNum+"..."+limit);
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
userList.add(new User("张三"+i,"123","1234"+i,30+i));
}
return new DataResult(200,"查询成功",userList);
}
@GetMapping("/{id}")
public DataResult getOne(@PathVariable Integer id){
User user = new User("张三","123","1234",30);
System.out.println("查询指定id");
return new DataResult(200,"查询成功",user);
}
@PostMapping
public DataResult addUser(@RequestBody User user){
System.out.println("增加..."+user);
return new DataResult(200,"添加成功");
}
@DeleteMapping("/{id}")
public DataResult deleteUser(@PathVariable Integer id){
System.out.println("删除"+id);
return new DataResult(200,"删除成功");
}
@PutMapping("/{id}")
public DataResult updateUser(@RequestBody User user){
System.out.println("修改..."+user.getId());
System.out.println(user);
return new DataResult(200,"修改成功");
}
}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="/js/jquery-3.4.1.min.js">script>
head>
<body>
<button onclick="sendGet()">GET请求button>
<button onclick="sendGetByID()">GET请求指定idbutton>
<button onclick="sendPOST()">POST请求button>
<button onclick="sendPUT()">PUT请求button>
<button onclick="sendDELETE()">DELETE请求button>
<script>
function sendGet(){
$.ajax({
url:'/users',
data:{
pageNum:3,
limit:10
},
method:"GET",
hello:function(res){
console.log(res);
}
})
}
function sendGetByID(){
var id = 10;
$.ajax({
url:`/users/${id}`,
method:"GET",
hello:function(res){
console.log(res);
}
})
}
function sendPOST(){
var user = {username:"张三",password:"123",phoneNum:"110001",age:30};
$.ajax({
url:`/users`,
method:"POST",
data:JSON.stringify(user),
contentType:"application/json",
hello:function(res){
console.log(res);
}
})
}
function sendPUT(){
var user = {username:"张三123",password:"456",phoneNum:"111101",age:20};
var id = 100;
$.ajax({
url:`/users/${id}`,
method:"PUT",
data:JSON.stringify(user),
contentType:"application/json",
hello:function(res){
console.log(res);
}
})
}
function sendDELETE(){
var id = 100;
$.ajax({
url:`/users/${id}`,
method:"DELETE",
hello:function(res){
console.log(res);
}
})
}
script>
body>
html>
向后端提交数据必须设置请求类型为
contentType:"application/json"
如果是低版本的SpringMVC(5.1之前),是不支持PUT、DELETE请求的,需要配置过滤器,当前版本无需配置
HttpPutFormContentFilter过滤器配置
<filter>
<filter-name>httpPutFormContentFilterfilter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
filter>
<filter-mapping>
<filter-name>httpPutFormContentFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
表单默认只支持GET、POST请求,如果使用其他的请求方式,那么都会默认当做是GET请求
配置HiddenHttpMethodFilter过滤器实现Put和delete请求
<filter>
<filter-name>hiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
前端表单中有两个要求:
请求方式必须为post:
method="post"
在表单中添加隐藏域:
name="_method" value="delete|put"
<form action="请求路径" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="测试put和delete">
form>