作为一个后端服务端开发者,经常会听到你会开发restful接口吗,可能我开发过?可能我又没有?但其实主要是因为我没有彻底搞懂restful风格接口,今天下午必须整明白!
REST架构
rest提出了一组架构约束条件和规则:统一接口、统一分层、按需代码。所有满足条件和规则的架构都称为RESTful架构。
统一接口:rest架构把网络中所有的可以访问和操作的数据、信息等都看作是资源。定义了对资源操作的统一方法和链接入口。
统一分层:系统分层,各层次间有良好的独立性。
按需代码:按需在客户端的应用程序上进行功能扩展。
REST接口设计规范
互联网越发展,大家对web应用需要更多。从以前的传动页面到前后端分离,到小程序、安卓、IOS等很多客户端类出现,客户端和服务端的通信,是希望有一个统一的接口规范让大家都能接受。
资源
以资源为基础:可以是二进制文件、也可以是一张图片、一个vedio等实体,通常以JSON或xml格式为载体,从数据库中获取。用URL定位资源。该资源存放形式对外不公开,外面只能获取资源。
统一接口:对资源做增删改查的操作,对应http协议的get、post、put、delete方法。如果使用restful风格的接口操作资源,从接口上看可能只能资源url,而不能表露出对资源做的操作。想知道具体对资源做了什么操作,还是需要看http请求方法类型,常见的方法类型:
GET:从服务器上获取资源
POST:在服务器上创建资源
PUT:在服务器更新资源(客户端需要提交完整的数据)
PATCH:更新资源(客户端只需要提交修改的资源数据)
DELETE:从服务器删除资源
以下是合格的RESTful风格接口
POST http://www.demo.com/koukou
GET http://www.demo.com/koukou
PUT http://www.demo.com/koukou
DELETE http://www.demo.com/koukou
下面是不符合RESTful规范的接口写法
POST http://www.demo.com/create_koukou
GET http://www.demo.com/query_koukou
PUT http://www.demo.com/update_koukou
DELETE http://www.demo.com/del_koukou
url设计规范:我们用url去定位资源,一个完整的URL组成由以下几个部分构成:
URI = scheme "://" host ":" port "/" path [ "?" query ][ "#" fragment ]
scheme:协议名
host:服务器的IP或域名
port:端口,http默认是80
path:资源路径
query:可选。一些查询参数,比如排序、数据分页等参数
fragment:可选。锚点,定位到页面的资源
无状态
RESTful接口要求是无状态的。任意一个web请求都必须和其他请求隔离开,如果客户端发起请求,消息本身就包含了服务端处理该请求所需的全部上下文,服务器不能保存客户端的信息。
符合RESTful规范的接口,服务端相应信息是包含状态码的,这些状态码是通用的,不用额外定义,下面是常见的http状态码:
1xx-相关信息,服务器正在处理
2xx-请求成功
3xx-资源重定向
4xx-客户端错误
5xx-服务器错误
为什么要无状态???
为了保证高可用,多个微服务通过负载均衡实现集群化部署,每个服务器之间都是独立和平等的,如果一个服务器在收到客户端请求的时候宕机或者不可用,其他服务器可以迅速处理这个无状态请求。如果请求是带状态的,那么每个请求都需要到指定服务器去处理,这就没意义了。
无状态只是说服务端无状态,但整个会话还是要状态维持的。一般客户端会和服务端进行多次通信才能完成一个完整的业务,但我们知道http协议是无状态协议,这就要求服务端可以识别几个独立的http请求的状态信息,把这些状态信息关联到业务流程中。比如服务端在不同时间点收到一个登录请求和取钱请求,如果不在技术层面对这些独立的http请求做关联的话,服务器就不知道这俩请求是【取钱业务】的一部分了。
普通的API和RESTful风格的API区别是什么呢?
从流程上来看: