你还在用 REST API 吗?

2020 年 12 月 31 日

你还在用 REST API 吗?

通过 HTTP 发送数据,许多开发人员已经在用 REST 了,而 GraphQL 通常被认为是一种代替遗留 REST API 的技术。本文将对比两者各自的优势、劣势以及它们之间的差异,希望能为你今后项目的技术选型提供帮忙。


什么是 REST?


REST(Representational state transfer,表述性状态转移) 是一种 API 设计架构,用于通过使用一组预定义的无状态操作(包括GETPOSTPUTDELETE)来实现 Web 服务。


REST 的核心思想是,通过向资源的 URL 发送请求并获得响应(通常是 JSON,但这取决于 API)来检索资源。


REST 的优势


  • REST 是 可扩展的,因为它分离了客户端和服务端,因此我们可以轻松扩展应用程序。

  • 灵活性 是使用 REST 的另一个优势,因为可以将其设计成处理不同类型的调用并返回不同的数据格式。


REST 的劣势


  • 抓取过度——这是指 API 端点提供的信息比客户端所需要的要多得多。

  • 抓取不足——这是指 API 端点并没有提供所需的全部信息。因此,客户端必须发出多个请求才能获取应用程序所需的全部内容。


什么是 GraphQL?


GraphQL 是一种 API 设计架构,它采用了不同的方法,在这种方法中,所有的东西都被视为一个表示其连接的图。这也意味着我们可以定制我们的请求,这样我们就可以从端点发出任何请求,并且能获得我们所请求的任何内容,仅此而已,无需更多操作。我们传递查询并得到响应。除此之外,它还允许我们将不同的实体组合到单个查询中。


GraphQL 的优势


  • 检索精确的数据,无任何多余数据。在 GraphQL 中,可以得到我们所请求的内容,这是一个很大的优势。

  • 客户端开发速度更快。通常,当数据需求发生变化时,我们只需修改查询,且无需太多的变更,因此可以快速进行产品迭代。客户端和服务端团队都可以独立工作,前提是他们都知道数据的结构。


GraphQL 的劣势


  • 对于简单的应用程序来说,设置类型、查询等可能有点 复杂,因为使用 REST 可以很容易地完成。

  • 它使用的是 单个端点,而不是遵循 HTTP 规范进行缓存。在网络级别进行缓存是很重要的,因为它可以减少到服务端的流量。


两者对比的简单示例


例如,我们正在显示用户的供稿,其中包含用户的帖子及其关注者的列表。在我们的例子中,我们必须显示该帖子的作者、帖子以及该用户的关注者。


如果使用 REST,我们至少要发出 2 到 3 个请求,类似于:


  • /user/<id>以获得用户(作者)的详细信息,比如名称。

  • /user/<id>/posts获取该用户发布的帖子列表。

  • /user/<id>/followers以获取该用户的关注者列表。


但是在所有这些情况下,我们都过度抓取数据了。例如,在第一个请求中,我们只需要名称,但是当我们使用这种方法时,我们将会获取该用户相关的所有详细信息。


此时就是 GraphQL 显示其强大功能的时候了。我们需要指定查询,然后才能获得所需的输出。要使用 GraphQL 实现相同的效果,我们可以使用类似于这样的查询:


query {  User(id: '123') {    name    posts {      title    }    followers {      name    }  }}
复制代码


通过使用这样的查询,我们将能获得具有以下属性的 JSON 响应。简洁明了,不是吗?


GraphQL vs REST


总结一下,两者主要有如下几个明显的差异:


数据抓取


REST 会导致抓取过度或抓取不足,而 GraphQL 则不会这样。在 GraphQL 中,我们得到的就是我们所要求的。


对象定义(JSON 响应)


在 REST 中,我们可以在后端定义对象,而在 GraphQL 中,我们则要在前端定义该对象。


自动缓存


REST 能自动生效缓存,而 GraphQL 则没有自动缓存系统,但是可以借助 Apollo Client、Relay 等客户端实现缓存。


错误处理


REST 中的错误处理比 GraphQL 简单得多,GraphQL 通常会给我们一个 200 OK 的状态码,即使已经出现错误了。但是,当使用 Apollo Client、Relay 等客户端时,它也能很容易处理错误。


结论


与 REST 相比, GraphQL 当然更具优势,但它可能并不总是最佳实践。正如我前面所说的,是选择 REST 还是 GraphQL,取决于我们的应用程序。


希望本文能为大家在未来项目的技术选型中提供帮忙。如果大家想分享自己关于 GraphQL 或 REST 的经验,请在评论区留言,感谢您的阅读!


原文链接:


https://medium.com/javascript-in-plain-english/stop-using-rest-for-apis-d697727ae6dd


2020 年 12 月 31 日 10:003

评论

发布
暂无评论
发现更多内容

TCP三次握手和四次挥手

Dnnn

GO 语言交叉编译

Dnnn

go

GO语言 MD5 四种实现方式

Dnnn

go

理解大端字节和小端字节

Dnnn

ZIP 也能边下载边解压?优酷流式解压技术揭秘

阿里文娱技术团队

ZIP

程序员快乐器之JAVA代码生成工具

Learun

敏捷开发 快速开发 生成代码

Go语言 sync.Mutex 源码分析

Dnnn

go

学完微软技术总监整理的44 个微服务架构设计模式,我涨薪了

Java架构师迁哥

Centos 上配置大数据环境

yuanhang

大数据

anyRTC推流小助手-客户端推流(PUSH RTMP)工具

anyRTC开发者

技术 音视频 WebRTC 直播 RTC

遇到银河提现不了网站维护审核怎么办?

丛林里的余光

数据库 网站平台 提现

epoll的原理和流程

Dnnn

Linux命令netstat详解

Dnnn

URL 去重的 6 种方案!(附详细实现代码)

王磊

Java

分布式追踪系统原理看不懂,40张图带你亲手实践

小Q

Java 架构 面试 分布式 系统设计

居然有人仅凭这份《Java面试宝典》就成功拿到了阿里、京东、字节跳动等大厂offer

Java成神之路

Java 编程 程序员 面试

关于第四次财富狂潮的思考,区块链如猛虎出笼?

CECBC区块链专委会

比特币 区块链 数字货币

Redis哨兵(sentinel )机制讲解

Dnnn

bit比特, Byte字节,基础知识

Dnnn

起飞!这份技术点拉满的ELk+Lucene笔记,可能价值百万

小Q

Java lucene elasticsearch 架构 面试

或许是史上最好的AQS源码分析了,AQS基础一

InfoQ_d2212957090d

AQS

PHP配置管理-yaconf

Dnnn

php

PHP Db类强制读主库(master)的设计

Dnnn

php MySQL

GO 语言异常处理

Dnnn

go

GO 语言超时实现

Dnnn

go

聊聊开发工程师如何转型产品经理

长沙造纸农

程序员 开发者 产品经理 转型 中年危机

如何设计Upload组件思考

赵孔磊

阿里架构师耗时三个月整理的Spring实战笔记:入门到实战

Java架构师迁哥

马云:今天的区块链并没有被人们认识到价值!

CECBC区块链专委会

区块链 阿里巴巴 马云

MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?

Dnnn

教师节送什么老师最开心?程序员三招解决家长送礼难题!

华为云开发者社区

编程 程序

你还在用 REST API 吗?-InfoQ