REST(Representational State Transfer),表现形式状态转换,在开发的角度则可以理解为访问网络的格式。
资源描述形式 | 查询对象(get) | 保存对象(post) |
---|---|---|
传统 | http://localhost/user/getById?id=1 | http://localhost/user/saveUser |
REST | http://localhost/user/1 | http://localhost/user |
通过对比很容易发现REST风格的资源描述形式书写起来更加的简化,访问资源的表达也比传统的资源描述形式更加的隐晦,这是很重要的,能够更好的保护我们的系统。
但是如果上面保存对象URL是http://localhost/user,那么修改对象的呢?删除对象的呢?
REST风格 | URL | 请求类型 |
---|---|---|
查询值定对象 | http://localhost/user/1 | get(查询) |
查询所有对象 | http://localhost/user | get(查询) |
删除对象 | http://localhost/user/1 | delete(删除) |
添加对象 | http://localhost/user | post(修改更新) |
修改对象 | http://localhost/user | put(修改更新) |
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作,也就是根据请求类型来决定相同的URL的不同的效果,关于请求的类型小编这里就不展开讲了,想要了解的小伙伴可以自行翻阅相关文章。
值得注意的是
:上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts.…
而根据REST
风格对资源进行访问称为RESTfu1
。
我们经常听到的一句话"使用RESTfu1的形式进行开发就是告诉你访问资源的格式"。
PS:目前这种开发风格在企业中使用比较广泛,所以决定写这么一篇博客,这篇博客基于Springboot开发来实现后面的案例,如果各位读者朋友想了解其他技术栈的相关实现可以给小编留言。
/**
* 查询所有的用户信息-->/user-->get
* 根据id查询用户信息-->/user/1-->get
* 添加用户信息-->/user-->post
* 修改用户信息-->/user-->put
* 删除用户信息-->/user/1-->delete
*
* 注意:浏览器目前只能发送get和post请求
* 若要发送put和delete请求,需要在web.xml中配置一个过滤器HiddenHttpMethodFilter
* 配置了过滤器之后,发送的请求要满足两个条件,才能将请求方式转换为put或delete
* 1、当前请求的请求方式必须为post
* 2、当前请求必须传输请求参数_method,_method的值才是最终的请求方式
*/
@Controller
public class TestRestController {
//@RequestMapping(value = "/user", method = RequestMethod.GET)
@GetMapping("/user")
public String getAllUser(){
System.out.println("查询所有的用户信息-->/user-->get");
return "success";
}
//@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Integer id){
System.out.println("根据id查询用户信息-->/user/"+id+"-->get");
return "success";
}
//@RequestMapping(value = "/user", method = RequestMethod.POST)
@PostMapping("/user")
public String insertUser(){
System.out.println("添加用户信息-->/user-->post");
return "success";
}
//@RequestMapping(value = "/user", method = RequestMethod.PUT)
@PutMapping("/user")
public String updateUser(){
System.out.println("修改用户信息-->/user-->put");
return "success";
}
//@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
@DeleteMapping("/user/{id}")
public String deleteUser(@PathVariable("id") Integer id){
System.out.println("删除用户信息-->/user/"+id+"-->delete");
return "success";
}
}
值得一提的是 @RequestBody
@RequestParam
@PathVariable
区别:
应用:
对此Springboot还衍生出了一个注解 @RestController 效果其实就是 @RequestBody + @Controller 更详细的内容各位读者朋友可以去查询相关文章。
REST风格的介绍就到此为止吧,感觉这篇文章写的比较摆烂,有一个值得注意的点是,如果前端想要通过表单直接发送DELETE、PUT是不行的,浏览器 form 表单只支持 GET 与 POST 请求。
如果想要在表单里面发送delete和put等请求在可在后端配置一个HiddenHttpMethodFilter过滤器。然后前端传参的时候使用input标签的隐藏域
指定正真的请求类型。
这里就不详细展开了,想了解的小伙伴可以自行查找相关文章,有问题的小伙伴可以在评论区留言。
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="TestRest PUT"/>
form>