1.背景介绍
什么是REST?
REST 表述性状态传递(英文:Representational State Transfer,简称REST),是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful
2.知识剖析
REST的核心在于,当你设计一个系统的时候,资源是第一位的考虑,你首先从资源的角度进行系统的拆分、设计,而不是像以往一样以操作为角度来进行设计
2.1RESTful要点
- 在REST中的一切都被认为是一种资源。
- 每个资源由URI标识
- 使用统一的接口。处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作。
- 无状态。每个请求是一个独立的请求。从客户端到服务器的每个请求都必须包含所有必要的信息,以便于理解。
2.2REST请求方法
- POST, GET, PUT, DELETE
- POST:新建资源,不安全。每次请求都会创建资源,多次发出POST请求,会创建多个资源。
- GET:获取资源,安全性。不管进行多少次操作,资源的状态都不会改变,GET只是访问和查看资源
- PUT:更新资源,用来修改数据内容,但是不会增加数据种类,也就是说无论进行多少次PUT操作,资源不会增加
- DELETE:删除资源
2.3通信过程的安全性
- GET请求将数据附在url上
- POST请求将数据放在http的包体中
3.常见问题
URI不够RESTful
动词不应该出现在URI中,动词或者说操作都是由请求方法标定的
使用错误的请求方法
幂等性和非幂等性必须区分清楚,不能混淆使用
4.编码实战
form表单的请求方法,如何使用delete、put
4.1配置过滤器,在web.xml中
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
4.2视图中,配置使用相应方法
<form method="post" action="category">
<input type="hidden" name="_method" value="PUT">
分类名称: <input name="name" value="" type="text"> <br><br>
<input type="submit" value="增加分类">
</form>
- 1
- 2
- 3
- 4
- 5
- 6
4.3代码中查看
@RequestMapping(value="/category/{id}",method=RequestMethod.DELETE)
public ModelAndView delete(Category category){
System.out.println("delete");
categoryService.delete(category);
ModelAndView mav = new ModelAndView("redirect:/category");
return mav;
}
@RequestMapping(value="/category/{id}",method=RequestMethod.GET)
public ModelAndView editCategory(Category category){
System.out.println("edit");
Category c= categoryService.get(category.getId());
ModelAndView mav = new ModelAndView("editCategory");
mav.addObject("c", c);
return mav;
}
@RequestMapping(value="/category/{id}",method=RequestMethod.POST)
public ModelAndView updateCategory(Category category){
System.out.println("update");
categoryService.update(category);
ModelAndView mav = new ModelAndView("redirect:/category");
return mav;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
5.扩展思考
REST缺点或者不适用的场景
存疑:rest更贴近于以资源来定义应用的架构。更加轻便和高效是rest的特点,而soap在面对更多的业务逻辑复杂的接口设计中更加有优势。如果一味的追逐rest风格,只会本末倒置、适得其反。
6.参考文献
https://baike.baidu.com/item/rest/6330506?fr=aladdin
https://blog.csdn.net/beagreatprogrammer/article/details/52535128
https://www.zhihu.com/question/33959971
https://blog.csdn.net/ruangong1203/article/details/51050586
7.更多讨论
Q:什么是幂等性?
A:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
Q:REST是万能的吗?
A:无状态带来了巨大的优势,同时也带来了难以解决的问题,例如,怎样授权特定用户才能使用的服务?怎样验证用户身份?如果坚持服务器无状态,也就是不记录用户登录状态,势必要求每一次服务请求都包含完整的用户身份和验证信息。在这种情况下,怎样避免冒认?怎样避免用户信息泄漏?事实上,构建REST附属的安全机制已经在讨论中,其结果无非导致另一个SOAP:复杂的需求摧残了易用性。
Q:REST是否有官方标准
A:REST式设计在许多方面均没有“官方”最佳实践和“如何按符合REST原则的方式、用HTTP解决一个特定问题”的标准方式。毋庸置疑,这是会逐渐得到改善的。尽管如此,REST具体表达了比基于WSDL/SOAP的Web服务更多的应用概念。换言之,虽然该批评对REST有很大价值,但这一批评更适用于其替换技术(它们基本上没有向你提供任何建议)。