Rest分享

分享提纲
引言:微服务, 漂亮小姑娘,帅气小伙

这老头是个奇人,特别擅长抽象归纳和制造概念。特别是微服务这种新生的名词,都有一个特点:一解释就懂,一问就不知,一讨论就打架。

REST是什么,是一个模式,是一个解决问题的套路,也可以说是一个风格。

REST有啥特征,
(1)REST有啥特征【优点】,为啥能胜出---多种不同类型客户端的出现
(2)REST的几个模型
(3)gitHub上Rest上的经典案例
(4)REST在spring中的实现--源码分析:
(5)具体在代码层面可以优化的点--校验,返回值【 json,text,docker,找不到时404 】

解耦

我们会设计一个用户友好的API,借助Jackon的功能将我们的模型序列化为JSON。
REST(表述性状态转移,Representational State Transfer)是一种架构风格,它定义了创建可扩展Web服务的最佳实践,这个过程中会充分发挥HTTP协议的功能。
RESTful Web服务会天然具备如下的属性。
客户端-服务器:UI是与数据存储分离的。
无状态:每个请求会包含服务器所需的足够信息,无需维护状态就能进行操作。
可缓存:服务器的响应中包含了足够的信息,客户端能够对数据存储做出合理的决策。
统一接口:URL会唯一识别资源,能够通过超链接发现API。
分层:API的每个资源都提供了最合理程度的细节。


这种架构的优势在于易于维护以及便于进行服务发现。它的扩展性也很好,因为没有必要在服务器和客户端之间维护持久化的连接,这样就没有必要进行负载均衡或会话粘性。最后,因为服务的内容非常简洁且易于缓存,所以服务会更加高效。


通过使用Richardson的成熟度模型
Leonard Richardson定义了著名的4个等级,从0级到3级,它们描述了Web API的“RESTful程序(RESTfulness)”。每个等级都需要开展额外的工作,并在API方面进行投入,但是这也会带来额外的收益。

第0级--HTTP
第0级非常容易实现,我们只需要让资源能够在网络上通过HTTP协议获取即可。你可以使用任意合适的数据表述形式(XML、JSON等),只要能够最好地满足你的使用场景即可。

第1级--资源
大多数的人在听到REST这个术语时,首先想到的是资源。资源是模型中某个元素的唯一标识符,例如这种元素可以是一个用户或者一篇Tweet。借助HTTP,资源会与一个统一资源标识符URL进行关联,如下面的样例所示:
/users将会包括所有用户的列表;
/users/11将会包含特定的用户;
/users/11/tweets包含了特定用户的所有Tweet列表。
/users/11/tweets/3用户11的id为3的tweet
这个级别的目的在于通过暴露多个特定的资源,来降低应用程序的复杂性。

至于服务器可以返回的响应类型,并没有相关的规则。

API形式的定义完全取决于你,只需记住一条简单的规则:最小惊讶原则。
给用户提供所预期的内容,这样你的API就已经很好了。


第2级--HTTP动作
这个级别是使用HTTP动作来识别资源可能的行为。这种方式能够很好地描述你的API能够完成什么功能,因为在开发人员中,HTTP动作是众所周知的标准。

在这个等级,提供响应的时候,建议使用有意义的HTTP代码。

第3级--超媒体控制

超媒体控制(Hypermedia Control)也被称为超媒体即应用状态引擎(Hypertext As The Engine Of Application State,HATEOAS)。在这个复杂的缩写词背后,蕴含着RESTful服务最重要的特性:通过使用超文本链接,可以进行服务的发现。这实际上就是服务器端通过响应头或响应体,告诉客户端其可选的功能。

以功能为中心的服务

思考功能为中心的Web服务的一个简单的方法是,想象你的代码在任何地方都可以调用一个功能(任何功能)。

参数+需要的数据--》序列化-----网络传输----》另一台机器---》转换成本地数据格式--》执行功能--》执行结果序列化---网络传输----》发起请求的机器--》反序列化成本地机器可以处理的格式---》代码继续执行


缺陷:要求太严格,跨编程语言、跨CPU架构,跨运行时环境,第一个方面都要遵守严格而精确的参数约定、变量转换,以及错误处理。此外,还要面对各种其它的挑战,比如资源锁、安全、网络延迟、并发、接口升级等。


以资源为中心的服务
将服务的关注点从功能转换到资源上。
以功能为中心的Web服务,每个功能都需要若干个参数,产生若干个结果值;
以资源为中心的Web服务,每个资源都代表一类对象,这些对象上面只能执行有限的操作(可以创建、删除、更新、获取资源)。资源的模型可以是任意的,但是和资源的交互的标准的。

REST服务使用URL统一定义资源。如果你知道一个资源的URL,你就可以决定使用某个HTTP方法使用这个资源。

REST服务并不一定要用JSON,不过这事实上已经是Web的标准,JSON由于其简单、结构紧凑、比XML易读等特点而广为流行。

控制反转(IOC)是一种从类中移除职责的方法,从而使类更简单,与系统其它部分更小耦合。控制反转的核心是不必知道是谁、怎样、何时创建和使用对象,尽可能地简单易于理解,对于软件设计而言,各部分互相知道得越少越好。


暴露的信息越多越早,越增加耦合性,未来需求变更的时候越麻烦。


缓存是一种重要的服务,目标是通过快速返回提前生成好的内容降低请求响应延迟。
缓存是构建可伸缩系统的一种重要技术

1、什么是REST?

  REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格的名词。REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web 服务,包括使用不同语言编写的客户端如何通过 HTTP处理和传输资源状态。

  为什么称为 REST?Web本质上由各种各样的资源组成,资源由URI 唯一标识。浏览器(或者任何其它类似于浏览器的应用程序)将展示出该资源的一种表现方式,或者一种表现状态。如果用户在该页面中定向到指向其它资源的链接,则将访问该资源,并表现出它的状态。这意味着客户端应用程序随着每个资源表现状态的不同而发生状态转移,也即所谓REST。

附:REST定义RESTSOAP的比较

2、REST成熟度的四个层次

  第一个层次(Level0)的Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种具体形  式。SOAP和 XML-RPC都属于此类。

  第二个层次(Level1)的Web 服务引入了资源的概念。每个资源有对应的标识符和表达。

  第三个层次(Level2)的Web 服务使用不同的 HTTP 方法来进行不同的操作,并且使用HTTP 状态码来表示不同的结果。如 HTTPGET 方法来获取资源,HTTPDELETE 方法来删除资源。

  第四个层次(Level3)的Web 服务使用 HATEOAS。在资源的表达中包含了链接信息。客户端可以根据链接来发现可以执行的动作。

 

  其中第三个层次建立了创建、读取、更新和删除(create,read, update, and delete,CRUD)操作与 HTTP方法之间的一对一映射。根据此映射:

(1)若要在服务器上创建资源,应该使用POST 方法。

(2)若要检索某个资源,应该使用GET 方法。

(3)若要更改资源状态或对其进行更新,应该使用PUT 方法。

(4)若要删除某个资源,应该使用DELETE 方法。

3、HTTP请求的方法

(1)GET:通过请求URI得到资源
(2)POST:用于添加新的内容
(3)PUT:用于修改某个内容,若不存在则添加
(4)DELETE:删除某个内容
(5)OPTIONS :询问可以执行哪些方法
(6)HEAD :类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据
(7)CONNECT :用于代理进行传输,如使用SSL
(8)TRACE:用于远程诊断服务器

 

4、HTTP请求的状态码

(1)成功Successful2xx:此类状态码标识客户端的请求被成功接收、理解并接受。常见如200(OK)、204(NoContent)。
(2)重定向Redirection3xx:这个类别的状态码标识用户代理要做出进一步的动作来完成请求。常见如301(MovedPermanently)、302(MovedTemprarily)。
(3)客户端错误Client Error 4xx:4xx类别的状态码是当客户端象是出错的时使用的。常见如400(BadRequest)、401(Unauthorized)、403(Forbidden)、404(NotFound)。
(4)服务器错误Server Error 5xx:响应状态码以5开头表示服务器知道自己出错或者没有能力执行请求。常见如500(InternalServer Error)、502(BadGateway)、504(GatewayTimeout)。

附HTTP1.1的标准简介:http://blog.chinaunix.net/uid-9188830-id-2007021.html



5、RestTemplate

5.1 简介

Spring'scentral class for synchronous client-side HTTP access.It simplifies communication with HTTPservers, and enforces RESTful principles. Ithandles HTTP connections, leaving application code to provide URLs(with possible template variables) andextract results.

简单说就是:简化了发起HTTP请求以及处理响应的过程,并且支持REST。为什么说简化了呢?

https://www.cnblogs.com/caolei1108/p/6169950.html

原文地址:https://www.cnblogs.com/softidea/p/10098765.html