Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过案例读懂 RESTful 架构风格

通过案例读懂 RESTful 架构风格

作者头像
搜云库技术团队
发布于 2019-10-17 09:58:25
发布于 2019-10-17 09:58:25
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

上世纪90年代面对高速发展的互联网规模,HTTP1.0需要进一步改进。Roy Fielding 着手制定HTTP1.1的标准及后续扩展工作。HTTP1.1重视降低WEB系统开发的复杂性(通过增强HTTP的请求头和响应头),提高系统的可扩展性(通过更容易的缓存指令)以及其他性能优化工作(比如长连接和多个请求和响应可以重叠等)。

Roy Fielding在制定HTTP时有一个愿景:Web世界的应用程序应随着不断的超连接跳转来实现应用系统状态迁移,所以HTTP应该是一个应用协议,而不是一个纯粹的超文本传输协议。

这就是REST的由来。当我们在谈论REST的时候,表示我们在谈论Web世界的应用一种基于HTTP的架构风格。

REST的构成

资源

在RESTful中资源是核心抽象,任何会被互联网组件访问的信息都是资源,并用一个URL/URN来标识。 举例来说,获取某网站的2017年10月1号的天气信息,该网站可以命名改信息为 http://www.somesite.com/weather/2017/10/1或者 http://www.somesite.com/weather?year=2017&month=10&day=1。客户端浏览器能用GET方法合法的获取该资源。

如果天气采集人员要创建2017年10月1号的天气信息,则用POST方法提交表单给 http://www.somesite.com/weather完成创建资源工作。 http://www.somesite.com/weather并没有制定哪一天的天气信息,但它确实资源,这体现资源的抽象性。

资源的表述

资源的表述是指资源的表现形式,这些形式由请求方和资源提供方通过HTTP协商指定。包括以下内容

1.MIME

Multipurpose Internet Mail Extensions

MIME是多用途互联网邮件扩展类型,它是一个互联网标准,扩展了电子邮件标准,使其能够支持: 非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

比如下图,客户端表示能接受json(首选),text(次选)以及任意格式(再次选);服务器端返回json内容给客户端:

2.缓存约定

所以的资源操作包括读取和更新操作,对于不频繁更新的数据数据多数可以进行缓存。这种换成越靠近客户端,用户体验越好,即提高了整体系统的可用性。 HTTP采取多层缓存机制,系统可以定义自己的缓存策略。(此处是否需要讲公共缓存,私有缓存,运行机制?)

其中代理服务器和缓存服务器应该只对公共缓存表述进行缓存,浏览器缓存对公共和私有的缓存表述都能进行缓存。通常代理服务器的缓存行为是用户所属组织支持的,不属于应用系统的行为。

资源的自描述

资源的自描述是指:资源的表述里面应该包括资源当前状态的描述,以及对该资源或相关资源进一步操作的超链接。

1.资源的当前状态

资源的当前状态由以下几项共同组成:

1、属于该资源的信息项目的值,比如订单的编号,创建日期。 2、相关资源的链接,比如订单的客户链接以及订单明细链接。 3、表示资源将来会迁移到某种可能状态的链接,比如迁移到完成状态的链接:/order/1/completeness POST 4、对应该资源与其他资源相关联的任何业务规则的求值结果,比如订单统计表:/order/statistics/year/2017 GET

下图是一个订单状态的json表述:

2.操作资源的统一接口

HTTP的初衷是应用层协议,HTTP是REST风格的。HTTP的动作提供了操作字体的统一接口。

幂等 表示动作的重复执行不会再产生副作用(引起资源状态变化),比如删除一个资源后再次删除也不会产生作用,同时系统也不应该返回错误信息,而是总是返回成功。

RPC或者SOAP风格的架构下HTTP是作为传输协议使用。

3.请求的无状态

REST的无状态是指客户端请求服务器时,应提供足够的信息以让服务器能理解并提供服务。无状态的好处包括:

1、改善可见性(监视系统不必为了确定一个请求的全部性质而去查看请求之外的其他请求) 2、改善可靠性(减轻了从局部故障中恢复的任务量) 3、改善可伸缩性(服务端不必在多个请求直接保存状态,从而允许服务器迅速释放资源)

缺点:

1、由于服务器不能保持会话状态数据,则会造成在每一次请求中发送大量重复的数据,可能会降低网络性能。

下图是请求有状态和无状态的对比例子:

HATEOAS

HATEOAS(The Hypermedia As The Engine Of Application Statue),中文意思是“将超媒体作为应用状态的引擎”,这是REST的最高目标(也叫主要架构约束)。

HATEOAS包括两个概念:

1、应用状态由应用(系统)中的各资源状态组成,资源状态的变化导致应用状态的变化。 2、通过在资源表述中添加状态迁移的超链接引导客户端改变资源状态。

比如:销售订单在创建后,客户端通过GET操作获取一个订单信息,然后请求“审批订单”链接使订单变成“已审批“状态。客户端再请求”执行订单“完成订单。这就是一个简单工作流程。

REST与分布式事物

分布式系统中事物是一个重要话题,遗憾的是REST作为一种系统风格,并没有约定对事物管理进行规定。事物是服务器端的事情,不论采用何种事物处理方式都要避免对客户使用rest服务的影响。

REST的典型应用案例

1. GitHub Developer API

比如API:列出pull的评论

GET /repos/:owner/:repo/pulls/:number/reviews

官网: https://developer.github.com/v3/pulls/reviews/

2. LinkIn 开发者中心

比如API:获取当前用户的信息

GET /v1/people/~?

官网:https://developer.linkedin.com/zh-cn/docs/rest-api

REST vs RPC

REST式的Web服务和RPC式的Web服务在接口定义上的区别是,REST使用HTTP通用方法作为统一接口的标准词汇,REST式的Web服务所提供的方法信息都在HTTP方法里,而RPC式的web服务所提供的方法信息在SOAP/HTTP信封里(其封装的格式通常是HTTP或者是SOAP),每个RPC式的web服务都会公布一套符合自己商业逻辑的方法词汇。

RPC的典型案例

1. 百度lbs服务API

比如API: 行政区划区域检索,之所以是rpc,是由于:

1、在参数中指定了资源格式MIME(此例是json),就是说资源表述由百度官方自定义协议解释。 2、返回状态和错误信息封装在返回结果中,说明对于错误处理也由百度官方自定义协议解释。 3、返回结果关心的是满足当前接口数据,如果想进一步了解街道信息,客户端须根据获取街道信息API定义获取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://api.map.baidu.com/place/v2/search?query=ATM&tag=银行&region=北京&output=json&ak=您的ak GET

如果经过rest风格改造,行政区划区域检索API的返回结果可以是如下形式:

注:百度lbs不是面向应用状态迁移设计,因此采用rpc也是合适的。

2.Saleforce SOAP API

Saleforce提供了SOAP(简单对象访问协议) API,SOAP 通过发布WSDL(网络服务描述语言)文件来描述服务器提供的API的输入参数结构和返回数据结构以及可能的异常信息。客户端通过WSDL生成客户端调用代码(SOAP语言无关,可跨开发语言调用),就能调用远程的服务API。

下图表示表示了Saleforce的提供的API的WSDL:

注:Saleforce也提供了REST的API。

以下是二者的主要区别:

以下是主流RPC和REST框架

总结

HTTP的本意是方便应用系统实现REST的架构,不过人们在早期并没有意识到它的优点,因此目前更多使用的是RPC框架,因为REST 对开发人员的能力要求更高。综上,REST具有以下主要特点:

1、以HTTP为应用协议。 2、基于WEB中间件进行扩展:缓存代理提高缓存扩展,反向代理提供负载均衡和内外网协议转化(HTTPS和HTTP之间)。 3、请求的无状态:由于服务器没有会话上下文信息,提高系统的可伸缩性。缺点是传输冗余一些。 4、多级缓存:客户端代理,代理服务器,缓存服务器提供了强大缓存能力,提高了系统的可用性。 5、对资源内容的描述方式,比如MIME协商或者在此基础上的扩展格式,保证了系统的简单性和通用性。 6、资源状态变化促成应用状态迁移(HATEOAS),可使开发者以资源为中心建模,这种设计相对简单。 7、资源表述中链接广告了应用的状态流,但并不强迫客户端进行处理,有利于客户端平滑升级。

以上内容有任何错误或不准确的地方请大家指正,不喜勿喷! 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

出处:https://dwz.cn/wcAR42Pu

往期精彩文章

一文读懂Apache Flink架构及特性分析

小米正式开源Istio管理面板Naftis

陆奇:除了写好代码,工程师怎样才算优秀?

面试题:2018最全Redis面试题整理

面试题:96道常考Java面试题,分享给大家,含答案

面试题:70道Spring面试题和答案

微服务:架构下静态数据通用缓存机制

微服务:小型系统如何“微服务”开发

微服务:深入理解为什么要设计幂等性的服务

微服务:有赞服务化架构演进

面试必备:HashMap源码解析(JDK8)

缓存穿透:缓存雪崩解决方案分析

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
API 架构风格抉择:SOAP、REST、GraphQL 和 RPC 的特性、优势与局限
两个独立的应用程序需要一个中介来相互通信。因此,开发人员通常会构建桥梁——应用程序编程接口 (API) ——以允许一个系统访问另一个系统的信息或功能。
架构精进之路
2025/04/16
4000
API 架构风格抉择:SOAP、REST、GraphQL 和 RPC 的特性、优势与局限
4种主流的API架构风格对比
本文讨论了四种主要的 API 架构风格,比较它们的优缺点,并重点介绍每种情况下最适合的 API 架构风格。
深度学习与Python
2021/01/21
2.6K0
使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API
1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作
solenovex
2019/11/12
6900
使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API
架构之:REST和RESTful
近几年微服务是如火如荼的在发展,而微服务之间的调用和渐渐的从RPC调用转移到了HTTP调用。于是经常听到有些同事说我们提供微服务并且暴露RESTful接口给别的系统,但是什么是RESTful接口呢?它和REST有什么关系呢? 别急,本文将会带你一探究竟。
程序那些事
2021/07/15
1K0
.NET 云原生架构师训练营(模块二 基础巩固 REST && RESTful)--学习笔记
理解RESTful架构:https://www.ruanyifeng.com/blog/2011/09/restful.html
郑子铭
2020/12/21
4630
.NET 云原生架构师训练营(模块二 基础巩固 REST && RESTful)--学习笔记
RESTful架构详解 转
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通 信的架构。REST指的是一组架构约束条件和原则。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
henrylee2cn
2019/04/04
1K0
RESTful架构详解
                                                                            转
Retrofit解析1之前哨站——理解RESTful
本篇文章是Retrofit的前哨站——理解RESTful。因为retrofit是基于RESTful架构。所以在讲解Retrofit之前,先来复习一下RESTful。本篇文章内容如下:
隔壁老李头
2018/08/30
7460
Retrofit解析1之前哨站——理解RESTful
【转载】理解本真的REST架构风格
    本文将带您领略REST架构的起源、与Web的关系、REST架构的本质及特性,以及REST架构与其他架构风格之间的比较。
莫问今朝
2018/08/31
6910
【转载】理解本真的REST架构风格
API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC
API作为系统间通信的桥梁,其设计风格也在持续发展和完善。SOAP、REST、GraphQL和RPC作为四种主流的API架构风格,各自具有鲜明的特点和适用场景。
公众号:码到三十五
2024/12/09
3070
API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC
网络协议 21 - RPC 协议(中)- 基于 JSON 的 RESTful 接口协议
    上一节我们了解了基于 XML 的 SOAP 协议,SOAP 的 S 是啥意思来着?是 Simple,但是好像一点儿都不简单啊!
北国风光
2019/04/11
1K0
【易错概念】RESTful, RPC, Webservice,RMI定义
REST即表述性状态传递(Representational State Transfer,简称REST),是一种软件架构风格。REST通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST) ,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。 Rest架构的主要原则:
辉哥
2019/08/08
3.3K0
基于场景选择微服务的API范式:REST、GraphQL、Webhooks和gRPC
原题:When to Use What: REST, GraphQL, Webhooks, & gRPC
yuanyi928
2018/10/23
2.8K0
基于场景选择微服务的API范式:REST、GraphQL、Webhooks和gRPC
Restful
Restful设计风格在当前前后端分离的情况下使用的还是蛮多的,只是开发的时候可能更侧重于编码,对于一些基本的概念理论没有去更多的了解,本文就这部分内容做一个简单的梳理
在水一方
2022/06/14
6620
Restful
前端要知道的RESTful API架构风格
前端程序员在开发完页面后总是要对接口的,跟后端联调有时候还占用蛮大的时间的,那么你了解你和后端对的接口都是什么风格吗,你们公司接口设计的如何,你使用愉快吗?自己在写Node服务时你遇到如何定义好接口的问题吗?下面介绍一种API架构风格,也是目前主流的API设计风格,你或许一直在使用。
张张
2019/12/27
1K0
RPC 和 REST还有RESTFul到底是个什么玩意?
直接在QQ获取ID为123456的用户。 2. 对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。例如:我们在使用CSDN的时候,在上传文章的时候REST规范就是你后台提供的API是使用的是HTTP 中是的POST方法。在删除文章的时候使用DELETE方法。
袁新栋-jeff.yuan
2020/08/26
4.3K0
RPC 和 REST还有RESTFul到底是个什么玩意?
你了解过系统集成服务集成交互技术:REST服务集成——RESTAPI吗
REST服务集成微服务架构倾向于使用轻量级的通信机制(通常是HTTP提供的API调用方式)实现服务之间的交互,基于API优先的服务契约管理成为微服务架构的重要原则之一。REST在HTTP的基础上提供了一系列架构约束和原则,帮助微服务更好地实现通信和集成。
愿天堂没有BUG
2022/10/28
1.7K0
你了解过系统集成服务集成交互技术:REST服务集成——RESTAPI吗
这次我让你彻底弄懂 RESTful
其实网上 RESTful 的文章有挺多的,不过有些讲的糊里糊涂的,而且很大部分都忽略了 HATEOAS。
Bug开发工程师
2020/12/15
5960
这次我让你彻底弄懂 RESTful
常见的API架构风格
在构建应用程序时,选择合适的API架构风格对于实现良好的性能和开发体验至关重要。以下是几种常见的API架构风格:
coderidea
2024/02/22
2760
常见的API架构风格
RESTful架构与RPC架构
在RESTful架构中,关注点在于资源,操作资源时使用标准方法检索并操作信息片段,在RPC架构中,关注点在于方法,调用方法时将像调用本地方法一样调用服务器的方法。
WindRunnerMax
2020/08/27
5200
深入解析 RESTful API:从设计到实践的完整指南
在当今的互联网世界中,不同系统之间的数据交互和通信是构建现代应用的核心需求。无论是移动应用、Web 平台,还是微服务架构,RESTful API 都扮演着桥梁的角色。它以其简洁性、灵活性和可扩展性,成为开发者构建分布式系统的首选方案。本文将从基础概念到实际应用,一步步拆解 RESTful API 的设计与实现,助你掌握这一关键技术。
DevKevin
2025/02/16
7850
相关推荐
API 架构风格抉择:SOAP、REST、GraphQL 和 RPC 的特性、优势与局限
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档