Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【API架构】使用 JSON API 的好处

【API架构】使用 JSON API 的好处

作者头像
架构师研究会
发布于 2022-05-29 03:58:48
发布于 2022-05-29 03:58:48
2.9K00
代码可运行
举报
文章被收录于专栏:超级架构师超级架构师
运行总次数:0
代码可运行

API 工艺的世界里,没有比设计更受热议的领域了。从 REST、gRPC 到 GraphQL,有许多方法可以设计和标准化 Web API 交互。今天,我们将注意力转向另一种方法,JSON API,JSONAPI.org 上详细介绍的用于构建 API 的规范。

JSONAPI.org 中描述的 JSON API 非常适合使您的 JSON 响应格式更加一致。以提高生产力和效率为目标,JSON API 因其可以消除多余的服务器请求的高效缓存功能而受到吹捧。

在这篇文章中,我们将定义 JSON API 是什么,并了解如何使用它来构建高效的 API。我们将介绍 JSON API 的一些主要优点,并通过 FitBit 的案例研究了解该规范在实践中的应用情况。希望本概述将介绍 JSON API 的新手,并帮助您判断它是否适合您的 API 场景。

什么是 JSON API (JSONAPI.org)?

JSON API 是一种适用于 HTTP 的格式。它描述了客户端应如何从服务器请求或编辑数据,以及服务器应如何响应所述请求。该规范的一个主要目标(现在是稳定的 v1.0)是优化 HTTP 请求;在请求数量和客户端和服务器之间交换的数据包大小方面。

“JSON API 是一种有线(Wire)协议,用于通过 HTTP 增量获取和更新图形” ——耶胡达·卡茨

在 JSON API 中,客户端和服务器都在请求文档中发送 JSON API 数据,带有以下标头,而不指定媒体类型参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Content-Type: application/vnd.api+json

JSON API 表示如何调用资源以及如何共享相关链接。JSON 对象位于请求的根部,它必须包含资源数据、错误或元信息。数据以及与数据的关系可以通过 GET 调用来获取,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /articles HTTP/1.1
Accept: application/vnd.api+json

以下是资源类型 `articles` 在 JSON API 响应中的显示方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ...
{
  "type": "articles",
  "id": "1",
  "attributes": {
    "title": "Rails is Omakase"
  },
  "relationships": {
    "author": {
      "links": {
        "self": "/articles/1/relationships/author",
        "related": "/articles/1/author"
      },
      "data": { "type": "people", "id": "9" }
    }
  }
}
// ...

到目前为止,相当标准的东西。JSON API 支持创建、更新和删除资源的典型 CRUD 流程。JSON API 将始终向后兼容,它是一个社区驱动的计划,在 Github 上接受拉取请求。

使用 JSON API 的好处

既然我们对 JSON API 是什么有了基本的了解,那么有哪些独特的优势使它脱颖而出?

复合文档

复合文档是 JSON API 中的一项独特功能,允许服务器将相关资源与请求的主要资源一起发送——如果实施得当,这可以减少必要的 HTTP 请求的数量。复合文档使用 include 参数工作,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://api.example.com/posts?include=author

这使您能够在初始请求中包含其他资源。

稀疏字段集

如果您使用复合文档来包含相关资源,您可能会遇到回复量大的问题。再一次,JSON API 有一个解决方案。

JSON API 的另一个独特方面是稀疏字段集,它使客户端只能从特定字段请求数据。它通过将要检索的字段添加到具有资源名称和所需字段的 URI 参数来工作。这提供了额外的定制,可以减少臃肿。它看起来像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /articles?include=author&;fields[articles]=title,body&;fields[people]=name HTTP/1.1
Accept: application/vnd.api+json

稀疏字段集是一种标准化方法,它允许客户端仅指定他们希望从对象中包含在响应中的属性。使用稀疏字段集,您只能获得所需的字段,提供独特的定制潜力,这对精益数据共享环境很有吸引力。

可选性

JSONAPI.org 中的许多功能都是可选的;您可以关闭或打开它们。这些功能使客户能够决定接受哪些资源,从而很好地适应精益的移动环境。让客户就如何检索和处理数据达成一致是有帮助的,因为它消除了冗余和优化以减少膨胀。

优化功能

JSON API 配备了许多功能来优化 API 返回包。JSON API 中的特殊服务器端操作包括排序和分页;将返回资源的数量限制为子集的能力,包括 first、last、next 和 prev 链接。

缓存

在他的演讲中,Lee 强调了定义良好的资源如何提高缓存能力,从而提高最终用户的“感知速度”。

“因为数据变化影响的资源更少,所以数据变化时失效的资源更少”

在 JSON API 用例中,缓存本质上是内置在 HTTP 中的。由于使用 JSON API 的客户端以相同的方式访问数据,因此他们不需要将数据存储在不同的位置。这种设计可能需要转变思想,但如果使用得当,可以带来显着的优化优势。

JSON API 如何在实践中使用:FitBit 案例研究

让我们看看 JSON API 如何在实践中实现以设计高效的 API,使用 FitBit 作为现实生活中的案例研究。

Jeremiah Lee 在 FitBit 领导 API 开发 4 年,在此期间他参与了他们的 JSON API 采用。健身可穿戴公司 FitBit 拥有蓬勃发展的 API 程序;在每年 40 亿次请求中,有 1/4 是通过第三方应用程序完成的,收入可观。

符合 API 风格有助于标准化客户端

一个常见的问题是当不同的客户端类型偏好不同的方法来从服务器检索数据时。围绕功能区域形成的工程团队通常一次一个平台地逐步实施新功能,并在每个客户端中找到相反的约束。

Lee 描述了 FitBit 团队如何拥有四个主要客户:AndroidiOSWindows 和 Web。一个主要问题是 Android 和 iOS 对 API 应该如何运行有非常不同的想法。iOS 更喜欢较少的网络请求和较大的 API 响应,而 Android 更喜欢更多的网络请求和较小的 API 响应。

为了将这些约束规范化为一致的数据模型,团队必须首先解决请求数量和请求大小之间的争论。FitBit 团队在具有敌对数据网络的移动环境中工作,无法依赖理想的客户端连接。

相信 HTTP/2、TLS 1.3 和改进的 LTE 网络的日益普及,FitBit 团队决定他们可以减少请求的开销、发出并发请求并减少安全延迟问题,同时相信更多弹性连接。这将导致他们采用更小的资源和许多轻量级的 HTTP 请求。

JSON API 帮助创建一致的数据模型

“如果没有明确的指导,数据模型可能会变得混乱。” ——耶利米·李

Lee 描述了在 FitBit,他们的 API 如何开始类似于“视图模型”;现有端点变得超载,数据相关性松散,而不是范围广泛。团队正在根据用户体验视图重载端点。

随着客户体验随着时间的推移而发展,团队正在以任意方式拆分数据。由于没有权威或风格可以遵循,这造成了很多不一致。客户端和服务器数据模型之间的错位造成了问题。团队需要就如何检索数据和处理数据达成一致,并且需要能够以很少的开销检查数据更改。

他们倾向于使用 JSON API 来规范化他们的数据。使用 JSON API 定义数据之间关系的能力,他们能够建立客户端-服务器通信期望。

JSON API 有助于保持同步

FitBit 案例中的另一个问题是与服务器保持同步。他们的设备需要经常与服务器同步,并且这些数据也可以被第三方应用程序修改。

这些更改必须非常快速地反映在所有 API 客户端中。JSON API 利用的 HTTP 缓存使他们能够防止召回过时的数据,从而减少冗余并提高最终用户的感知速度。根据 Lee 的说法,这真的开始在一个应用程序中叠加多种体验。

比较 JSON API 和 GraphQL

既然我们本质上是在讨论使用图形,为什么不使用 GraphQL 呢?虽然您可以使用 GraphQL 实现许多相同的功能,但 Lee 看到了采用 JSON API 的两个主要好处:分页和可缓存性。

分页是 GraphQL 没有专门解决的一个领域。或者,当客户端请求它们时,JSON API 会向客户端提供诸如 next 和 prev 之类的链接。由于 GraphQL 中的分页完全由客户端处理,Lee 认为这很不幸,因为客户端可能会在不知不觉中进行昂贵、耗时的数据库查询。

GraphQL 也没有利用 HTTP 缓存功能,因为它与协议无关。由于没有建议的通用方法,这意味着每个 GraphQL API 处理缓存的方式都会略有不同。

“我个人认为缓存对于客户端性能考虑来说太重要了,不能事后考虑” ——耶利米·李

Lee 还指出,使用 JSON API 意味着开发人员不必采用像 GraphQL 这样的另一个工具链,而是可以继续使用他们很可能已经熟悉的技术。

GraphQL 的许多好处,例如查询效率和减少往返调用,都可以在 JSON API 中使用稀疏字段集和复合文档进行匹配。JSON API 因此可以提供与 GraphQL 相同的功能。

考虑将 JSON API 用于“实用”的 API 设计

JSON API LogoJeremiah Lee 称其为“务实”,我们必须同意。如上所述,让客户端和服务器共享一个通用数据模型(如 JSON API)有很多优点。

“JSONAPI.org 规范应该是您的智能默认设置” ——耶利米·李

虽然 JSON API 并不适合所有情况,但许多人声称它是客户端和服务器通过 HTTP 共享通用数据接口的一种很好的默认方式。凭借上面列出的优势,以及它的健康采用,JSON API 似乎是 API 风格的有力竞争者。

我们鼓励您自己阅读规范。您如何看待 JSONAPI.org?您使用什么规范来定义您的 API 和数据模型?

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

本文分享自 首席架构师智库 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC
API作为系统间通信的桥梁,其设计风格也在持续发展和完善。SOAP、REST、GraphQL和RPC作为四种主流的API架构风格,各自具有鲜明的特点和适用场景。
公众号:码到三十五
2024/12/09
2080
API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC
API 架构风格抉择:SOAP、REST、GraphQL 和 RPC 的特性、优势与局限
两个独立的应用程序需要一个中介来相互通信。因此,开发人员通常会构建桥梁——应用程序编程接口 (API) ——以允许一个系统访问另一个系统的信息或功能。
架构精进之路
2025/04/16
1470
API 架构风格抉择:SOAP、REST、GraphQL 和 RPC 的特性、优势与局限
安息吧 REST API,GraphQL 长存
即使与 REST API 打交道这么多年,当我第一次了解到 GraphQL 和它试图解决的问题时,我还是禁不住把本文的标题发在了 Twitter 上。
疯狂的技术宅
2019/03/27
2.8K0
安息吧 REST API,GraphQL 长存
GraphQL与传统API对比介绍教程
在现代应用程序开发中,API(应用程序接口)扮演着至关重要的角色。随着技术的发展,API的实现方式也在不断进化。本文将介绍两种常见的API实现方式:传统API(主要是REST)和GraphQL,并对它们进行对比分析。
IT蜗壳-Tango
2024/06/22
2760
与我一起学习微服务架构设计模式8—外部API模式
Web应用在防火墙内部运行,它们通过高带宽、低延迟的局域网访问服务。其他客户端在防火墙之外运行,通过较低带宽、较高延迟的互联网或移动网路访问。
java达人
2019/12/06
1.4K0
新一代数据查询语言GraphQL来啦!
1. GraphQL来啦! 当Facebook构建移动应用的时候,它需要的是一个强大的数据获取API: 足够强大,满足Facebook自身复杂业务的需求; 足够简单,对开发者和使用者来说很容易上手与使
IMWeb前端团队
2017/12/29
3K1
新一代数据查询语言GraphQL来啦!
理解 GraphQL:现代 API 查询语言的详解与实践
GraphQL 是一种用于 API 的查询语言,以及一个用于执行查询的服务器端运行时。它允许客户端精确地请求所需的数据,避免冗余和不足。GraphQL 由 Facebook 于 2012 年开发,并在 2015 年开源。
编程小妖女
2024/12/28
1560
理解 GraphQL:现代 API 查询语言的详解与实践
4种主流的API架构风格对比
本文讨论了四种主要的 API 架构风格,比较它们的优缺点,并重点介绍每种情况下最适合的 API 架构风格。
深度学习与Python
2021/01/21
2.4K0
标准化技术下的软件开发
聊到集成测试、单元测试等测试分类,我想大多数人都有类似困惑或讨论,集成测试和 E2E 测试到底有啥区别。甚至还有一些系统测试、配置项测试等概念,不但让我们这种非 QA 专业的人弄不清楚,在和我们的 QA 同学讨论时也很难得到清晰的结论。
ThoughtWorks
2019/09/29
9640
标准化技术下的软件开发
深入解析 RESTful API:从设计到实践的完整指南
在当今的互联网世界中,不同系统之间的数据交互和通信是构建现代应用的核心需求。无论是移动应用、Web 平台,还是微服务架构,RESTful API 都扮演着桥梁的角色。它以其简洁性、灵活性和可扩展性,成为开发者构建分布式系统的首选方案。本文将从基础概念到实际应用,一步步拆解 RESTful API 的设计与实现,助你掌握这一关键技术。
DevKevin
2025/02/16
2880
GraphQL与OpenAPI:数据治理的优缺点
一位财富 50 强公司的 CTO 评估了 OpenAPI 和 GraphQL API 标准的优缺点,以及它们与数据治理的相关性。
云云众生s
2024/08/13
1850
API接口架构REST vs GraphQL
无论是创建网站,还是移动应用程序,我们都需要通过 API 来传递数据,通过 API 我们可以获取到数据库中的数据,可以操作数据库,可以处理一些业务逻辑。现在最流行的 API 架构是 REST。但是,GraphQL 正在逐渐追赶着它。
程序那些事儿
2023/03/07
1.7K0
API接口架构REST vs GraphQL
常见形式 Web API 的简单分类总结
请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口。API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应。响应的格式通常是JSON或XML。
solenovex
2018/10/15
3.2K0
【RESTful】RESTful API 接口设计规范 | 示例
参考官方文档:https://tools.ietf.org/html/rfc2616
前端修罗场
2023/10/07
1.8K0
【RESTful】RESTful API 接口设计规范 | 示例
RESTful架构API风格与相关规范 极客开发者
以上是对RESTful架构的概述,在本文中,我将使用自己的理解完整的表述RESTful的规范,以及如何设计符合RESTful规范的API。实际上,在对计算机技术的理解中,一百个人可能会有一百种理解方式,尽管见仁见智,但我们的目的都是把技术当作工具,去实现我们的程序功能。如果在本文中的描述有所错误,或您有所不解,欢迎留言评论!
极客开发者
2022/01/18
4220
人人都是 API 设计者:我对 RESTful API、GraphQL、RPC API 的思考
有一段时间没怎么写文章了,今天提笔写一篇自己对 API 设计的思考。首先,为什么写这个话题呢?其一,我阅读了《阿里研究员谷朴:API 设计最佳实践的思考》一文后受益良多,前两天并转载了这篇文章也引发了广大读者的兴趣,我觉得我应该把我自己的思考整理成文与大家一起分享与碰撞。其二,我觉得我针对这个话题,可以半个小时之内搞定,争取在 1 点前关灯睡觉,哈哈。
用户2781897
2019/05/17
1.1K0
架构师该如何为应用选择合适的API
架构师的主要活动是做出正确的技术决策。选择合适的API是一项重要的技术决策。那么今天就看看API的选择问题。
yuanyi928
2020/06/17
1.7K0
最流行六种的 API 架构风格(附 Node.js DEMO)
本篇将介绍六种最流行的 API 架构风格,分别是 SOAP、RESTful、GraphQL、gRPC、WebSocket 和 Webhook。对于每种 API 架构风格,我们将深入探讨其优点、缺点以及适用场景,并提供相应的 DEMO 以帮助读者更好地理解每种 API 架构的实现方法和运作原理。
Cellinlab
2023/06/01
2.2K0
最流行六种的 API 架构风格(附 Node.js DEMO)
GraphQL 初体验,Node.js 构建 GraphQL API 指南
过去几年中,GraphQL 已经成为一种非常流行的 API 规范,该规范专注于使客户端(无论是客户端、前端还是第三方)的数据获取更加容易。
coder_koala
2021/01/08
8.4K1
【REST架构】OData、JsonAPI、GraphQL 有什么区别?
我在职业生涯中使用过很多 OData,现在我来自不同团队的同事中很少有人建议我们迁移到 JsonAPI 和 GraphQL,因为它与 Microsoft 无关。我对这两种查询语言都没有太多经验。据我所知,OData 是 Salesforce、IBM、Microsoft 使用的标准,并且非常成熟。为什么要切换到 JsonAPI 和/或 GraphQL?有真正的好处吗?JsonAPI 和 GraphQL 是新标准吗?根据受欢迎程度更改公共 api 实现似乎没有用,尤其是在没有太大好处的情况下。
架构师研究会
2022/05/29
1.7K0
相关推荐
API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验