概念
RESTful通常采用Http+JSON实现。Representational State Transfer 全称翻译为表现层状态转化。REST 是属于 WEB 自身的一种架构风格,是在 HTTP 1.1 规范下实现的。REST最大的几个特点为:资源
、统一接口
、URI
和无状态
。
Resource:资源。就是网络上的一个实体。
Representational:表现形式,比如用JSON,富文本等;
State Transfer:状态变化。通过HTTP 动作实现。
资源就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。每个资源对应一个URI,想要获取一个资源,访问它的URI就可以了,URI只代表资源的实体,资源的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
客户端想与服务器互动,用到的手段只能是HTTP协议。对数据的CRUD操作,分别对应Http方法。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
什么是RESTful架构:
rest一种软件架构风格,而不是标准,只是提供了一组设计原则和 约束条件。它主要用于客户端和服务器交互类的软件。基于这 个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
Springboot 实现 Restful 服务,基于 HTTP / JSON 传输,适用于前后端分离。
@RequestMapping 处理请求地址映射。
method - 指定请求的方法类型:POST/GET/DELETE/PUT 等
value - 指定实际的请求地址
GET?a=1 //普通请求
GET/a/1 //rest请求
幂等性
幂等性用来表示发送一次和多次请求引起的边界效应是一致的,作用于结果而非资源。
HTTP GET
方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。
GET /listUsers # 获取用户列表
GET /user/1 # 查看指定的用户
HTTP DELETE
方法 调用一次和多次对资源产生影响是相同的,所以也满足幂等性。
HTTP POST
方法是一个非幂等方法,因为调用多次,每次都会产生新的资源。
HTTP PUT
方法 因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。
POST和PUT对比
两者对比,两个方法都用于创建资源,本质的差别是在幂等性。HTTP POST方法是非幂等,所以用来表示创建资源,HTTP PUT方法是幂等的,因此表示更新资源更加贴切。
restful与rpc对比
1、RPC(Remote Procedure Calling),面向方法,即从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
由于一些产品复杂度高,所以普通RestfulAPI方法无法表达,比如重启实例、退款、挂载磁盘等,所以目前Ecs等很多产品都使用这类接口
2、REST风格。REST是一套设计原则(风格/模式),而非具体的架构或者标准。这个风格API适用于资源类的API,进行资源的增、删、改、查等操作。所以目前使用到的有服务编排、容器服务、批量计算等多产品使用此风格API。
springmvc对restful的支持
- get和post的提交method跟web方式完全相同;
- put和delete方式在restful风格需要在表单增加一个隐藏域hidden,并分别设置相应的
_method
方法,后端接口处理设置好接受不的method外,还需要再web.xml中设置隐藏域的method方式转换
<!--配置springmvc请求⽅式转换过滤器,会检查请求参数中是否有_method参数,如果有就
按照指定的请求⽅式进⾏转换-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filterclass>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>