简介
近几年微服务是热火朝天的在倒退,而微服务之间的调用和慢慢的从RPC调用转移到了HTTP调用。于是常常听到有些共事说咱们提供微服务并且裸露RESTful接口给别的零碎,然而什么是RESTful接口呢?它和REST有什么关系呢?
别急,本文将会带你一探到底。
REST
REST是一种架构。
首先咱们要记住的是REST是一种架构形式,并不是一种协定。它只是通知咱们应该如何去搭建一个牢靠的零碎。
REST的全称是REpresentational State Transfer。中文可能不好翻译,咱们暂将其定义为有代表性的状态本义。它是分布式系统的一种架构形式。最先是由Roy Fielding在2000年他的博士毕业论文中首先提到的。
REST架构在当初的web利用中十分常见,它并不波及到具体的编码,它只是一种高级比的领导计划,具体的实现还是由你本人决定。
REST和RESTful API
咱们刚刚解说了REST,那么REST和RESTful API有什么关系呢?
咱们晓得,API是服务和服务之间,客户端和服务端之间沟通的桥梁,通过API之间的调用,咱们能够从服务器中获取到须要的资源信息。而RESTful API就是合乎REST架构的API。
所以不是所有的HTTP协定的API都是RESTful API,它的前提是你的零碎是REST架构的。
REST架构的根本准则
那么什么样的零碎能力被称为是REST架构的零碎呢?依据Roy Fielding的论文形容,REST架构的零碎有6个基本特征。咱们一一来阐明。
Uniform interface对立的接口
在REST架构中,最为外围的元素就是资源。咱们将资源定义为一个个的独立的URI。一个资源用一个独立并且惟一的URI来示意。
单个的资源不能太大也不能太小,它示意的是一个独立的能够操作的单位。这些资源通过通用的获取形式来进行获取和操作。比方对资源的CURD能够别离用不同的HTTP method来示意(PUT,POST,GET,DELETE)。
同时须要对资源进行对立的命名,定义对立的link格局和数据格式。
还有一点,依据HATEOAS协定,一个资源还应该蕴含指向该资源或者相干资源的URI。能够能有些同学当初对这一点还有些纳闷,不过没关系,前面咱们会具体对HATEOAS进行解说。
Spring也提供了对HATEOAS的反对,咱们看一个根本的HATEOAS的申请:
GET http://localhost:8080/greeting
该申请的返回能够是这样的:
{ "content":"Hello, World!", "_links":{ "self":{ "href":"http://localhost:8080/greeting?name=World" } }}
大家能够看到下面返回了一个代表本人URI的资源链接。
Client–server 客户端和服务器端独立
另外的一条规定就是客户端和服务器端独立,客户端和服务器端互不影响,他们之间的惟一交互就是API的调用。
对于客户端来说只有可能通过API获取到对应的资源即可,并不关怀服务器是怎么实现的。
而对于服务器端来说,只须要提供放弃不变的API即可,本人外部的实现能够自在决定,也不须要思考客户端是如何应用这些API的。
这条规定对于当初的很多前后端拆散的架构来说曾经应用了。
Stateless无状态
和HTTP协定一样,REST架构中各个服务之间的API调用也是无状态的。无状态的意思是服务器并不保留API调用的历史记录,也不存储任何对于客户端的信息。对于服务器来说,每个申请都是最新的。
所以用户的状态信息是在客户端进行保留和保护的,客户端须要在每个接口带上能够辨认用户的惟一标记,从而在服务器端进行认证和辨认,从而获取到对应的资源。
Cacheable可缓存
缓存是晋升零碎速度的利器,对于REST的资源也是一样的,在REST中对于可缓存的资源须要表明它是能够被缓存的。
从而对应的调用方能够将这些资源进行缓存,从而晋升零碎的效率。
Layered system分层零碎
古代的零碎基本上都是分层的,在REST架构中也是一样,只有保障对外提供的资源URI是统一的,架构并不关怀你到底应用的是几层架构。
Code on demand按需编码
一般来说,REST架构中各个服务通常是通过JSON或者XML来进行交互的。然而这并不是硬性规定。能够返回可执行的代码间接运行。
RESTful API的例子
咱们来举几个常见的RESTful API的例子,来见识一下这种架构的神奇之处:
申请一个entity:
GET https://services.odata.org/TripPinRESTierService/People
依据ID申请一个entity:
GET https://services.odata.org/TripPinRESTierService/People('russellwhyte')
申请一个entity的某个属性:
GET https://services.odata.org/TripPinRESTierService/Airports('KSFO')/Name
应用filter进行查问:
GET https://services.odata.org/TripPinRESTierService/People?$filter=FirstName eq 'Scott'
批改数据:
POST https://services.odata.org/TripPinRESTierService/Peopleheader:{ Content-Type: application/json}body:{ "UserName":"lewisblack", "FirstName":"Lewis", "LastName":"Black", "Emails":[ "lewisblack@example.com" ], "AddressInfo": [ { "Address": "187 Suffolk Ln.", "City": { "Name": "Boise", "CountryRegion": "United States", "Region": "ID" } } ]}
删除数据:
DELETE https://services.odata.org/TripPinRESTierService/People('russellwhyte')
更新数据:
PATCH https://services.odata.org/TripPinRESTierService/People('russellwhyte')header:{ Content-Type: application/json}body:{ "FirstName": "Mirs", "LastName": "King"}
总结
本文解说了REST和RESTful相干的概念,那么对于其中最重要的资源如何定义呢?敬请期待后续文章。
本文已收录于 http://www.flydean.com/01-rest-restful/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!