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框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...
随机推荐
- django drf 权限permission
https://www.django-rest-framework.org/api-guide/permissions/#custom-permissions from django.shortcut ...
- SparkSQL大数据实战:揭开Join的神秘面纱
本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...
- Android优化之内存优化倒计时篇
本文来自网易云社区 作者:聂雷震 本篇文章介绍的内容是如何在安卓手机上实现高效的倒计时效果,这个高效有两个标准:1.刷新频率足够高,让用户觉得这个倒计时的确是倒计时,而不是幻灯片:2.不能占用太多的内 ...
- “全栈2019”Java多线程第二章:创建多线程之继承Thread类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第三章:try代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- javassist学习
最近学习了javassist的使用方法. javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等. 下面是如果用javassist来动态创建一个类的demol 我们需要创建的目标类, ...
- mxonline实战2, 后台管理神器xadmin
对应github地址:xadmin的使用 第三天:xadmin的安装以及各应用模型的后台管理注册 一. 安装xamdin 1. 源码包下载地址 https://gith ...
- 基于注解的Spring容器源码分析
从spring3.0版本引入注解容器类之后,Spring注解的使用就变得异常的广泛起来,到如今流行的SpringBoot中,几乎是全部使用了注解.Spring的常用注解有很多,有@Bean,@Comp ...
- 负载均衡群集LB
负载均衡群集是目前企业用得最多的群集类型,通过主节点负载调度器(Director),使用特定的分流算法,将来自客户机的访问请求分担给多个服务器节点共同处理,从而缓解整个系统的负载压力,响应更多请求:群 ...
- SAE实践——创建新应用开启MySQL服务
1. 创建SAE应用 当创建完成SAE账户之后,即可创建SAE应用.点击创建新应用按钮,创建一个新的SAE 应用 阅读提示信息,等待五秒,点继续创建. 填写应用信息完成创建.可选择PHP5.3和空应用 ...