简介

近几年微服务是热火朝天的在倒退,而微服务之间的调用和慢慢的从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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!