为什么RESTful很糟糕?

【C++】auto关键字(C++11,超详细解析,小白必看系列) 本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。 阅读详情

周六晚上,RESTful发明人罗伊悄悄来到了咖啡馆,他想看看自己引以为傲的RESTful到底用得怎么样。 

(RESTful的故事参见《RPC发展简史》)

靠着门的那张桌子有一帮人,他们居然还在讨论老掉牙的Java RMI,似乎遇到了什么技术难题。 

看来无论是什么技术,都会有非常古老的遗留系统需要维护,真是苦逼的程序员啊, 罗伊感慨。 

这边的一群人在讨论Google的Protobuf , 看来在序列化这一块儿已经有了长足的进展,都可以实现跨语言序列化了。 

再往里边走,终于有人讨论RESTful了! 罗伊心中一阵激动。 

只听到一个人说道:“我们领导刚开始强制用RESTful的面向资源的风格,大家还挺新奇的,可是用着用着,我们就‘退回’到那种面向函数的方式了。”  

“是啊是啊,我还是更习惯传统的RPC方式,更加直观,尤其是用了Dubbo以后,面向函数的风格不要太爽。”  

罗伊心中有点失望。 

RESTful的硬伤

“其实吧,RESTful有个硬伤,你们发现没有?”  有个叫做格拉夫的人突然来了一句。 

“什么硬伤?” 

“我给你们举个例子,” 格拉夫说道,“比如我有两个资源,一个叫做Article ,一个叫做User。” 

640?wx_fmt=png

“这很正常啊,对资源可以增删改查。” 罗伊说道,他的话也引起了周围人的附和。 

“听我说完,我现在要开发一个手机端,要展示一个文章的列表,假设界面原型是这个样子:” 

640?wx_fmt=png

“第一步,我需要获得这些文章列表,可以这么做  GET /articles ” 

640?wx_fmt=png

“这也没问题啊!不就是一个普通的获取资源表示的方式吗?” 人群中有人说道。 

可是罗伊敏锐地发现,界面中需要一个“作者头像”, 很明显,这个作者头像并不在Article这个资源中保存, 而是在User中。 

在返回的结果中只有author_id, 如果想要获得作者头像,需要对返回的文章列表做循环,取出author_id ,然后在通过/users这个资源进行查询。 

640?wx_fmt=png

当罗伊把这个查询展示出来以后,周围人群就炸了锅:“有多少个文章,就额外发出多少次查询,这怎么行?! 实际中肯定不能这么干!” 

还有人说:“我们仅仅需要头像信息(avatar_url),你返回这么多乱七八糟的gender, age,last_login_time干嘛! ”  

“这RESTful真是糟糕啊!”

罗伊有点尬尴,没想到我的RESTful会存在这么两个问题: 

1.  发送请求过多 (对每个文章,都得额外查询作者信息) 

2.  太多的额外信息(其实只想要avatar_url这个字段) 

想到此处,罗伊的心一下子就沉了下去,怎么解决这个问题呢? 

中间层


老祖宗教导我们: 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决!  

这个中间层是什么? 罗伊想到了前后端还没有分离的时候,页面都是在后端渲染的,程序员会创建一个VO(View Object),在这个VO中,会把界面展示所需要的信息都封装起来,然后再发给JSP去使用。 

在RESTful当中,也可以搞一个类似VO的资源出来啊, 想到此处,他对格拉夫说道:“你为什么不搞一个HotArticle这样的资源出来呢? ” 

640?wx_fmt=png

这个HotArticle可以把文章和作者做个组合,只返回那些界面需要的数据。 

格拉夫说道:“这样可不好, 这个HotArticle资源相当于和界面深度绑定了。界面如果要变化,这个HotArticle也得变化,很麻烦啊。”  

罗伊说:“那就一起变化呗,反正两个是一致的。” 

“不,还有更复杂的情况, 假设界面发生了变化,需要把作者头像替换成文章的封面图, 这时候怎么办呢?” 

罗伊说:“我明白你的意思,不就是说要同时支持老的手机端和新的手机端吗?简单,有两种方案。” 

(1) 复用HotArticle, 保留原来的avatar_url, 添加一个新的字段 article_img_url, 不同的手机端各取所需。 

(2) 给HotArticle做个新版本。老的手机端用老版本,新的手机端用新版本。  

“第一种方案好!很简单!” 人群中有人说道。 

“好啥啊,如果手机界面持续变化,你用第一种办法,那个HotArticle很快就成了垃圾堆了,要是没有准确无误的文档,都不知道哪个字段被谁使用!”  

“第二种方案会搞出很多版本来,假设要改个公共的东西,比如要增加一个文章的阅读数,那岂不是所有的都得改? ” 

可见两种办法各有优劣, 在应对手机端界面持续变化时都有问题,都不完美。这也是后端资源和前端界面绑定后的恶果啊。 

灵活查询

罗伊陷入了沉思: 能不能让手机端按需查询呢?  

服务器端保持最简单的Article 和 User的概念,把他们看成两张表,手机端发出像SQL 那样的查询,把自己需要的给查出来,最好能类似于Join的功能。 

想到此处,他就写了这么一个SQL : 

select a.id, a.title, a.abstract, a.liked_count, u.avatar_url from Article a , User u where a.author_id = u.id 

640?wx_fmt=png

看到这个图,人群轰然叫好:“还是SQL大法好!” 

只有格拉夫冷冷地说道:“SQL的局限性太大, 比如我还要把作者的朋友同时显示到手机端,这SQL就不好写了,文章和作者是一一对应的,但是作者的朋友可能有多个,这样SQL的结果集中就会有重复的文章id , title , abstract了。” 

罗伊说:“那你说怎么办?”  

“关系模型在表示这样的关联的时候,非常不方便,我发明了一个新的模型和新的查询语言, 大家看看吧。” 

古怪的查询

格拉夫展示了一个查询的方法: 

640?wx_fmt=png

大家猛地一看, 这个查询太古怪了啊,这是什么语法? 

虽然古怪,却非常实用,精确地描述了这个需求:我需要一个id 为11的用户, 把他的name, age, avatar_url等字段给我取过来,其他字段就不用发过来了。 

查询结果也是标准的JSON格式,和要查询的内容一一对应,非常容易理解。 

罗伊问道:“这也没啥啊,你怎么解决之前的问题?” 

格拉夫又展示了一个查询,这一次复杂了一些: 

640?wx_fmt=png

 “看到没有? 这次表示一个article列表,每个article元素里边有id, title, abstract,liked_count等字段。 还有一个特殊字段叫做author,相当于在article中嵌套了一个元素,这个author元素还有一个字段叫做avatar_url。 ” 

众人一看,觉得非常有意思,用这种方式完美地解决了之前的问题。 

只需要一次查询,文章和作者的头像一起就发回来了,更重要的是,没有什么乱七八糟的额外信息。 

如果想加上作者的朋友信息,可以把查询改成下面这个样子,非常灵活。 

640?wx_fmt=png

看到此处,罗伊就明白了几分,这是一种新的查询方式,不同于关系数据库的SQL, 也不同于RESTful, 很明显,后端的数据模型也得发生变化。 

他问道:“你后端的数据模型难道是图Graph吗?”  

格拉夫赞道:“被你看出来了,真是厉害,为了支持这样的查询,在后台的数据模型就是一张图:”

640?wx_fmt=png

 “根据这张图,我就可以查找出任意的数据了,从Article找到作者, 从作者找到相关的朋友......, 只要你把关联做好,没有什么做不到的。” 

“那些Article, User类型及其属性是不是也得明确地定义下来?” 罗伊又问道。 

格拉夫对罗伊投去赞叹的目光, 说道:“没错,可以这么定义。” 

640?wx_fmt=png

一目了然,大家都非常喜欢! 

“这个新的查询语言叫什么名字?” 

“我叫格拉夫(Graph),所以这个查询语言叫做GraphQL!” 

往期精彩回顾

我是一个线程

我是一个Java Class

面向对象圣经

函数式编程圣经

TCP/IP之大明邮差

CPU阿甘

我是一个网卡

我是一个路由器

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

华为昇腾Ascend C中级认证考试-tanh 注册昇腾社区账号后可以免费领券考试。 阅读详情

相关推荐

antdv-<a-form>的使用

是 Ant Design Vue 中用于创建表单的组件,提供了一种结构化的方式来收集用户输入。它支持多种布局、验证、数据绑定等功能,非常适合用于处理用户输入和提交数据。

2302_81312344的博客 2619

restful api 与 GraphQL 分析比较

背景 REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。 REST 的 API 配合JSON格式的数据交换,使得前后端分离、数据交互变得非常容易,而且也已经成为了目前Web领域最受欢迎的软件架构设计模式。 但随着REST API的流行和发展,它的缺点也暴露了出来: • 滥用REST接口,导致大量相似度很高(具有重复性)的API越来越冗余。 • 对于前端而言

代码讲故事 1849

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1096

Restful风格是“垃圾”?

restful适用场景分析

f_h_h的博客 290

Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案

AI Agent作为当前人工智能应用开发的核心范式,通过赋予大语言模型(LLM)自主规划、工具调用和环境交互能力,正在重塑软件智能化进程。其技术原理基于智能体架构,通过提示工程、函数调用和记忆机制,将LLM从单纯的文本生成器转变为能够执行复杂任务的工作流引擎。这一技术价值在于显著降低了构建智能应用的开发门槛,同时保持了高度的灵活性和可扩展性。在实际应用场景中,AI Agent广泛落地于智能客服、代码助手、数据分析自动化等领域,成为连接大模型能力与具体业务需求的关键桥梁。本文聚焦的Koog框架,正是针对JVM

weixin_42594419的博客 398

用ESP32-S3打造迷你录音笔:SPIFFS存储+INMP441麦克风全流程解析

本文详细解析了如何使用ESP32-S3微控制器与INMP441数字麦克风构建迷你录音笔。内容涵盖硬件选型、I2S驱动配置、SPIFFS文件系统存储管理以及WAV格式封装等全流程,重点探讨了在资源受限的嵌入式设备上实现高质量语音采集与存储的优化方案和实战技巧。

qq_27496129的博客 1369

restful不难记住原则就够了

URL具有很强可读性的,具有自描述性 规范化请求过程和返回结果 资源描述与视图的松耦合 可提供OpenAPI,便于第三方系统集成,提高互操作性 提供无状态的服务接口,降低复杂度,可提高应用的水平扩展性

yq1214792901的博客 297

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 382

【内有代码】为什么不推荐使用 RESTful API?

如果你要问 Spring Boot 做什么最厉害,我想答案就在本章标题 RESTful API 简称 REST API 。本项目源码下载(https://github.com/fishpr...

qq_18244417的博客 1254

手把手拆解:储能电站如何实现‘孤岛运行’与‘黑启动’?从SVPWM控制到无缝并网

本文深入解析储能电站的孤岛运行与黑启动技术,从SVPWM控制策略到电网重构实战。通过详细的三环控制架构和黑启动五阶段技术路线,展示储能电站在电网故障时如何快速切换为独立电压源并实现电网重建。文章还探讨了虚拟惯量补偿、多站协同控制等前沿技术,为电力系统应急恢复提供关键解决方案。

weixin_30509393的博客 309

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4517

WebService为什么不如RESTful API流行

1 WebService有很多协议,为什么HTTP比较流行? WebService是个很重型的规范,它的应用协议是SOAP(简单对象访问协议),它所依赖的下层通信方式不单单是HTTP,也有SOAP over SMTP, SOAP over TCP,由于HTTP协议群众基础广,开发调试方便,所以,成了WebService中最为流行的方式。 甚至很多公司在内网通信,也用HTTP来做,比如,

baolin811的专栏 1万+

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

Bresenham视线生成是一种高效的算法,用于在二维网格上绘制直线。Bresenham算法可以应用在栅格地图中进行一维碰撞检测,即检查起点和终点间直线是否穿过障碍栅格。本文图解Bresenham碰撞检测的原理,并给出ROS C++/Python/Matlab三种实现加深理解

FRIGIDWINTER的博客 1万+

设计糟糕的 RESTful API 就是在浪费时间!

作者| 帝都羊责编| 郭芮现在微服务真是火的一塌糊涂。大街小巷,逢人必谈微服务,各路大神纷纷忙着把自家的单体服务拆解成多个Web微小服务。而作为微服务之间通信的桥梁,...

优快云资讯 2263

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Restful API简介

Restful API 定义 REST:表述(编者注:通常译为表征)性状态转移。指的是一组架构约束条件和原则。如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作...

weixin_41010294的博客 871

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

为什么你的API总是被吐槽?重构PHP RESTful服务的6步法则

掌握PHP RESTful API设计难题?本文总结6步重构法则,解决接口混乱、性能低下等问题,适用于高并发场景,提升代码可维护性与响应效率。实用方法论+最佳实践,值得收藏。

SimProceed的博客 712

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

“RPC好,还是RESTful好?”

REST 和 RESTful 什么区别?REST,即Representational State Transfer的缩写。翻译过来是表现层状态转换。如果一个架构符合REST原则,就称它为RESTful架构。啥叫json-rpc?接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等;通信比较流行的是h...

weixin_30900589的博客 650

RPC好,还是RESTful好?

转:https://blog.youkuaiyun.com/douliw/article/details/52592188 看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好,还是RESTful API好? 还有其他优秀的推荐方案吗? ----------------------------------------------------------------- 先科普一下 REST ...

zf_yusen的专栏 297

一个虐你千百遍的问题:“RPC好,还是RESTful好?”

看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好,还是RESTful API好? 还有其他优秀的推荐方案吗? 先科普一下 REST 和 RESTful 什么区别?     REST,即Representational State Transfer的缩写。翻译过来是表现层状态转换。 如果一个架构符合REST原则,就称它为RESTf

王启军 6万+

fguillot json rpc_JSON-RPC比RESTful API的比较

先说结论JSON-RPC比RESTful API好很多。解释我厌恶restful API如同我厌恶OOP;但与其说我厌恶restful,倒不如说我厌恶鼓吹restful API的一些伪·程序员。很多鼓吹restful API的程序员,实际上并不理解restful的设计理念,纯粹是在人言亦言,随便看了几篇网文在说restful,自己便也更着鼓吹。做为一个合格的技术人员,最基础的要求是要对自己所使用的...

weixin_34701183的博客 160

RESTful源码学习笔记之RPC和 RESTful 什么区别

REST,即Representational State Transfer的缩写。翻译过来是表现层状态转换。如果一个架构符合REST原则,就称它为RESTful架构。啥叫json-rpc?接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等;通信比较流行的是http、soap、web...

dengxiangbao3167的博客 131

restful api

前言 在以前,一个网站的完成总是“all in one”,页面,数据,渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员必须同时具备前后端知识。于是慢慢的后来兴起了前后端分离的思想: 后端负责数据编造,而前端则负责数据渲染,前端静态页面调用指定api获取到有固定格式的数据,再将数据展示出来,这样呈现给用户的就是一个”动态“的过程,而关于api这部分的设计则成了一个问题。如何设计出一个便于理解,容易使用的api则成了一个问题。 而所谓的restful就是用来规范我们的api的一种约束。

波哥在路上 280
上一篇: 上了公众号的“贼船”, 后悔吗?
下一篇: 千万别用设计模式?
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值