Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2020-5-6-restful理解

2020-5-6-restful理解

作者头像
黄腾霄
发布于 2020-06-10 07:19:21
发布于 2020-06-10 07:19:21
49400
代码可运行
举报
文章被收录于专栏:黄腾霄的博客黄腾霄的博客
运行总次数:0
代码可运行

Restful已经是目前我们耳熟能详的概念了,但是找了下网上的文章,大部分都是介绍restful API范式。很少介绍resetful架构的。今天同大家介绍下对restful的理解。此外,阮一峰的文章也很不错,感兴趣的同学也可以参考。理解RESTful架构 - 阮一峰的网络日志


什么是RESTful

Representational state transfer - Wikipedia中的解释是表现层状态转换英语Representational State Transfer)。

它代表了一种架构风格,统一了webAPI的格式,允许客户端以uri访问和操作互联网的资源。

这么说比较抽象,我们换一种角度来看它。

从0开始设计网络接口

正如我在2020-3-8-MVC、MVP、MVVM模式演变简析 - huangtengxiao中说的,一切gui软件本质目的都是将模型进行恰当的呈现(model->view)。web应用当然也不例外。

假设我们现在有如下的模型,两个同学,A和B。他有name和age两个属性,其中name字段全局唯一。

那么对于这个模型,如果我们在数据库创建一张表,该如何表示呢?

很简单是吧。那我们试着使用编程语言进行表示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取所有对象
let people=getPeople();
//根据索引找到对象
let A=people['A'];
let B=people['B'];
//进行操作
console.log(A.age);

OK,那我们使用RESTfulAPI进行这个模型的表示会是怎么样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /people

[{
        "name": "A",
        "age": 
    },
    {
        "name": "B",
        "age": 
    }
]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /people/A

{
    "name": "A",
    "age": 
}

我们可以看到这写模型的表示方法是一致的,都是使用一个唯一标识获取到模型对象。

而RESTful的一个重要观点就是,互联网上一切对象都是资源,而uri就是定位这一个资源的标识符。

如果有同学了解领域驱动开发(DDD),那么就可以这样理解:每个网站提供了一个领域模型,我们通uri获取,这个领域模型中的实体对象,这个uri就是实体的标识符。

所以现在可以理解为什么大家在设计RESTfulAPI时,总是在说要找’名词’。因为RESTfulAPI的目标就是对特定场景建模,用uri定位领域模型中的实体(名词来源),而不是在网络提供一系列数据操作服务(动词来源)。

RESTful的优势——关注点分离

那么RESTful有什么好处呢?

很多文章里面提到了无状态,可缓存等等。这些的确是RESTful的好处,但是我认为最大的优势还是模型和表示的关注点分离。即uri只负责模型,Content Negotiation负责表示。

Content Negotiation

举个例子,我们互联网应用常见的用户有人类和软件(爬虫等),xml对人类更友好,json对软件更友好。

因此我们往往需要针对同一个模型,提供xml和json的不同表示方法。

如果没有使用RESTful,我们可能会有以下的API设计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/people/A/xml
/people/A?type=xml
/people/A.xml

明明是同一个对象,为什么要设计这么多不同的路由规则?而且如果这些在同一个项目组中进行扩散,后果更不堪设想。

如果使用RESTful,我们只要在不同的客户端的http头中申明Accept: application/xml,而不需要更改uri。

Versioning

另一个主要优势点是版本管理。

例如我们经常能见到http://api.example.com/v1这样的uri。

这种情况的大部分成因是,后续版本增加了模型字段,查询参数或者是重命名名称等等,造成了和现有API的不兼容。(注意:这里大部分情况下,不同版本API对应的后端数据库的模型还是一致的,否则启用新的API,而不是更新版本)

所以这还是同一个模型,不同表现形式的问题。而使用RESTful,只要设置Accept-version: v1即可保证uri的一致性。

综上所述,RESTfulAPI可以使得API风格和模型更加贴近,实现了uri对实体的映射,减轻了路由规则的复杂度。

RESTful的缺陷

RESTful的缺陷也是很明显的,从数据操作获取服务变成了ORM,意味着API的爆炸,每一个实体都有一个API。

为了减少网络传输量,许多网站不得不针对RESTfulAPI的GET请求提供诸如?limit=3等服务端的filter等操作。

为了解决这一问题,GraphQL作为新一代的API风格也受到越来越多的关注。

大家有兴趣可以参考[GraphQL

A query language for your API](https://graphql.org/)


参考文档:

[GraphQL

A query language for your API](https://graphql.org/)


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/restful%E7%90%86%E8%A7%A3.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2020-5-10-RESTfulAPI中能否使用query string
之前2020-5-6-restful理解 - huangtengxiao和大家介绍了对RESTful的理解。然后就有小伙伴问了我灵魂问题,对于RESTfulAPI设计,是不是不能使用query string?
黄腾霄
2020/06/10
5980
2020-5-16-理解Graphql
之前2020-5-6-restful理解 - huangtengxiao和大家提及了RESTfulAPI的一个弊端,就是接口膨胀。
黄腾霄
2020/06/10
6580
2020-5-11-HATEOAS简介
之前2020-5-6-restful理解 - huangtengxiao和大家介绍了对RESTful的理解。今天和大家介绍下RESTful中最重要的一个概念HATEOAS。
黄腾霄
2020/06/10
7790
更好的理解RESTFUL
RESTFUL 当前已然成为 API 设计的最佳规范, 但是有些读者还对 RESTFUL 不太了解, 包括微信群里这两天也有朋友在问, 今天干脆总结下。
iTesting
2019/10/29
4470
更好的理解RESTFUL
通俗易懂RESTful,如何设计RESTful风格API「建议收藏」
REST — REpresentational State Transfer 直译:表现层状态转移。这个中文直译经常出现在很多文章中。尼玛,谁听得懂“表现层状态转移”,这是人话吗?
全栈程序员站长
2022/07/04
7590
通俗易懂RESTful,如何设计RESTful风格API「建议收藏」
CoAP | 物联网中的RESTful架构实现
说起 HTTP,相信大家都不陌生,HTTP 全称 Hyper Text Transfer Protocol,即超文本传输协议。
Mculover666
2020/07/16
9180
深入理解什么是RESTful API ?
越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。   网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,** 现在我们必须考虑,如何开发在互联网环境中使用的软件。**
竹清
2018/08/31
6430
深入理解什么是RESTful API ?
深入理解什么是RESTful API ?
越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。   网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,** 现在我们必须考虑,如何开发在互联网环境中使用的软件。**
AWeiLoveAndroid
2018/09/03
3.2K0
深入理解什么是RESTful API ?
理解RESTful架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。 网站开
非著名程序员
2018/02/08
5390
理解RESTful架构
前端要知道的RESTful API架构风格
前端程序员在开发完页面后总是要对接口的,跟后端联调有时候还占用蛮大的时间的,那么你了解你和后端对的接口都是什么风格吗,你们公司接口设计的如何,你使用愉快吗?自己在写Node服务时你遇到如何定义好接口的问题吗?下面介绍一种API架构风格,也是目前主流的API设计风格,你或许一直在使用。
张张
2019/12/27
9270
restful api接口规范和服务调用的区别_rest接口规范
网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备…)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现”APIFirst”的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。
全栈程序员站长
2022/10/01
1.8K0
如何给老婆解释什么是Restful
果不其然,看着看着,她又对我发难了,“Restful是什么呀,老公?是restaurant的形容词吗,突然就觉得好饿了啊......”
Java3y
2019/09/24
4850
如何给老婆解释什么是Restful
理解RESTFul和SOA
RESTFul基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格, rest是Representational State Transfer的缩写
yaphetsfang
2020/07/30
8640
RESTful 架构到底是什么?
REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。
JavaEdge
2021/10/18
6250
我所理解的RESTful Web API [设计篇]
《我所理解的RESTful Web API [Web标准篇]》Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建。构建REST风格的Web服务是最近两三年风行的潮流,所以很多人以为REST是一个事物。而事实却是:REST自其诞生之日起到现在(2014年)已经有14年了,它为什么叫这么一个“奇怪”的名字呢? 目录 一、为什么叫这个“奇怪”的名字?二、采用URI标识资源 二、采用URI标识资源 三、使
蒋金楠
2018/01/15
1K0
我所理解的RESTful Web API [设计篇]
RESTful 架构以及 RESTful API开发
在周三的测试运维试听课程中,芒果给大家介绍了RESTful架构以及RESTful API开发-Django REST Framework,这里我们来做个小总结。
TestOps
2022/04/07
8780
RESTful 架构以及 RESTful API开发
RESTful入门概述
RESTful(Representational State Transfer)表述性状态转移,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
爱笑的架构师
2020/09/24
2020
RESTful
HTTPS为接口的安全提供了保障,可以有效防止通信被窃听和篡改,可以通过 cerbot等工具。
仇诺伊
2020/04/23
7610
RESTful
接口测试概念之RESTful​ API
接口测试和开发中,我们常常会听到一个概念:restful风格、RESTful API,这些概念到底是什么呢?
吾非同
2020/10/23
7600
RESTful API,以及如何使用它构建 web 应用程序。
RESTful API是一种基于REST(Representational State Transfer)架构风格的API(Application Programming Interface),它采用HTTP协议中的GET、POST、PUT、DELETE等方法,对资源进行操作。RESTful API的核心思想是以URL为资源的唯一标识符,通过HTTP协议中的动词方法对资源进行操作。
人不走空
2024/02/20
2940
相关推荐
2020-5-10-RESTfulAPI中能否使用query string
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验