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。
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分享的更多相关文章
- .net点选验证码实现思路分享
哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 干货分享:SQLSERVER使用裸设备
干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...
- Java8实战分享
虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- Android调用微信登陆、分享、支付
前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...
- MVC常遇见的几个场景代码分享
本次主要分享几个场景的处理代码,有更好处理方式多多交流,相互促进进步:代码由来主要是这几天使用前端Ace框架做后台管理系统,这Ace是H5框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...
随机推荐
- 后台生产验证码code和byte[]图片
引用命名空间 using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System ...
- MaxScript通过.net发送邮件
Fn SmtpSendMail argSmtpAddress argSenderAddress argSenderPassword argTargetAddress argTitle argMessa ...
- kubectl get componentstatus ERROR:HTTP probe failed with statuscode: 503
通过kubectl命令可以查看k8s各组件的状态: [root@wecloud-test-k8s-1 ~]# kubectl get cs NAME STATUS MESSAGE ERROR cont ...
- django系列3.1--url路由配置, 正则, 分发include, 分组命名匹配
一.url配置 在django项目中urls.py文件中就是为这个url调用的view(视图)函数之间的映射表,来配置访问的一个url执行什么代码 默认的基本格式: from django.conf. ...
- Android Studio设置字体
一,点"Settings"按钮,调出配置界面: 然后如图找到 Editor-colors&font-font ,默认的不让修改 所以先点击save as 随便起个名字 , ...
- MySql数据库备份的几种方式
mysqldump工具备份 备份整个数据库 $> mysqldump -u root -h host -p dbname > backdb.sql 备份数据库中的某个表 $> mys ...
- 546. Remove Boxes
Given several boxes with different colors represented by different positive numbers. You may experie ...
- 牛客OI赛制测试赛1 题解
A 斐波那契 数竞生:这不是送分的常识吗? 这里引入一个叫卡西尼恒等式的玩意. 公式表达就是 设$fib[i]$为斐波那契数列的第$i$项$(i>0,i \in N_+)$ 则有 $fib[i+ ...
- 初探APT 攻击
作者:joe 所属团队:Arctic Shell 本文编写参考: https://www.freebuf.com/vuls/175280.html https://www.freebuf. ...
- JAVA数组的遍历和取最值
1.获取数组中的所有元素,会用到数组的遍历 数组的遍历,通常用for循环. public class ArrayDemo { public static void main(String[] args ...