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

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

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

Rest分享的更多相关文章

  1. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  2. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  3. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  4. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  5. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  6. 干货分享:SQLSERVER使用裸设备

    干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...

  7. Java8实战分享

    虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...

  8. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  9. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  10. MVC常遇见的几个场景代码分享

    本次主要分享几个场景的处理代码,有更好处理方式多多交流,相互促进进步:代码由来主要是这几天使用前端Ace框架做后台管理系统,这Ace是H5框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...

随机推荐

  1. C#多线程编程系列(一)- 简介

    目录 系列大纲 一.前言 二.目录结构 四.章节结构 五.相关链接 系列大纲 目前只整理到第二章,线程同步,笔者后面会慢慢更新,争取能把这本书中精华的知识都分享出来. C#多线程编程系列(一)- 简介 ...

  2. Proxy account failing to run SSIS Error (Proxy (11) is not allowed for subsystem "SSIS" and user "AB\testuser ".

    USE [msdb]EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSISProxyAgentV1', @login_name=N'WTC\E ...

  3. 自己的Java规范文档

    参考阿里Java规范文档 不建议使用过时方法 泛型需要加上<>,这种方式创建的对象是不推荐的. Map object = new HashMap();//禁止使用 字符串比较时,不需要大小 ...

  4. 决定以后再做公司的项目的时候,能够用其他语言的绝对不用delphi

    1.delphi7的IDE真的很不友好 2.delphi7的控件有的有问题 3.delphi7居然不支持结构体的泛型存储 4.网上的解决文档超少,一些小bug,就要折腾半天 5.pascal语法太过结 ...

  5. Delphi开发安卓程序的感受

    Delphi XE7开发安卓程序,界面开发速度非常快,这是eclipse无法比的,还有就是界面自适应能力很棒,我在不同版本和尺寸的设备中测试,运行良好,这些设备包括:三星I9100(安卓2.3:不到5 ...

  6. java简单正则验证手机号

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Title:Tadesfza * @Description ...

  7. 洛谷P5279 [ZJOI2019]麻将(乱搞+概率期望)

    题面 传送门 题解 看着题解里一堆巨巨熟练地用着专业用语本萌新表示啥都看不懂啊--顺便\(orz\)余奶奶 我们先考虑给你一堆牌,如何判断能否胡牌 我们按花色大小排序,设\(dp_{0/1,i,j,k ...

  8. 任意模数NTT和FFT的玄学优化学习笔记

    本来一直都是写\(7\)次的\(MTT\)的--然后被\(shadowice\)巨巨调教了一通之后只好去学一下\(4\)次的了-- 简单来说就是我们现在需要处理一类模数不为\(NTT\)模数的情况 这 ...

  9. Spring Boot 入门系列

    本系列博文版权 简书 面皮大师 所有,转载请标明原文及出处: http://www.jianshu.com/u/062bd8f1299c 项目地址: https://github.com/daleiw ...

  10. MySQL数据库管理

    好记性不如烂笔头 1.MySQL启动基本原理 /etc/init.d/mysqld 是一个shell启动脚本,启动后会调用mysqld_safe脚本,最后调用的是mysqld主程序启动mysql. 单 ...