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

2023-11-06

在 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 数据,带有以下标头,而不指定媒体类型参数:

Content-Type: application/vnd.api+json


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

GET /articles HTTP/1.1
Accept: application/vnd.api+json


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

// ...
{
  "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 参数工作,如下所示:

GET https://api.example.com/posts?include=author


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

稀疏字段集


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

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

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 团队如何拥有四个主要客户:Android、iOS、Windows 和 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 和数据模型?

本文 :https://architect.pub/benefits-using-json-api
讨论:知识星球【首席架构师圈】或者加微信小号【ca_cto】或者加QQ群【792862318】
公众号
 
【jiagoushipro】
【超级架构师】
精彩图文详解架构方法论,架构实践,技术原理,技术趋势。
我们在等你,赶快扫描关注吧。
微信小号
 
【ca_cea】
50000人社区,讨论:企业架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化.
 

QQ群
 
【285069459】深度交流企业架构,业务架构,应用架构,数据架构,技术架构,集成架构,安全架构。以及大数据,云计算,物联网,人工智能等各种新兴技术。
加QQ群,有珍贵的报告和干货资料分享。

视频号 【超级架构师】
1分钟快速了解架构相关的基本概念,模型,方法,经验。
每天1分钟,架构心中熟。

知识星球 【首席架构师圈】向大咖提问,近距离接触,或者获得私密资料分享。  

喜马拉雅 【超级架构师】路上或者车上了解最新黑科技资讯,架构心得。 【智能时刻,架构君和你聊黑科技】
知识星球 认识更多朋友,职场和技术闲聊。 知识星球【职场和技术】
领英 Harry https://www.linkedin.com/in/architect-harry/
领英群组 领英架构群组 https://www.linkedin.com/groups/14209750/
微博‍‍ 【超级架构师】 智能时刻‍
哔哩哔哩 【超级架构师】

抖音 【cea_cio】超级架构师

快手 【cea_cio_cto】超级架构师

小红书 【cea_csa_cto】超级架构师  

网站 CIO(首席信息官) https://cio.ceo
网站 CIO,CTO和CDO https://cioctocdo.com
网站 架构师实战分享 https://architect.pub   
网站 程序员云开发分享 https://pgmr.cloud
网站 首席架构师社区 https://jiagoushi.pro
网站 应用开发和开发平台 https://apaas.dev
网站 开发信息网 https://xinxi.dev
网站 超级架构师 https://jiagou.dev
网站 企业技术培训 https://peixun.dev
网站 程序员宝典 https://pgmr.pub    
网站 开发者闲谈 https://blog.developer.chat
网站 CPO宝典 https://cpo.work
网站 首席安全官 https://cso.pub    ‍
网站 CIO酷 https://cio.cool
网站 CDO信息 https://cdo.fyi
网站 CXO信息 https://cxo.pub

谢谢大家关注,转发,点赞和点在看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Web架构】使用 JSON API 的好处 的相关文章

  • 适用于移动应用程序的 REST API 上的 OAuth

    我正在开发移动应用程序的后端 使用 ASP NET MVC 4 Web Api 构建 RESTful API 该应用程序将在 iOS 和 Android 上运行 我的用户将只能使用他们的 Facebook 帐户登录 并且只有登录后 他们才能
  • Extjs Restful Store,批量发送请求?

    我创建了一个带有商店配置的网格组件 如下所示 Create the store config store new Ext data Store restful true autoSave false batch true writer ne
  • 如何解码这个 JSON 字符串?

    这是我从 feed finder url 中得到的字符串 JSON 编码 updated 1265787927 id http www google com reader api 0 feed finder q u003dhttp itca
  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 如何对数组的数组进行 JSON_MODIFY?

    我的结构看起来像这样 Declare layout NVARCHAR MAX N Sections SectionName Section1 SectionOrder 1 Renders RenderName Render1 RenderO
  • 使用 JSONP 时出现“无效标签”?

    我的 JSONP 请求有问题 数据不会显示 Firebug 显示 无效标签 错误 我的 JavaScript ajax url link dataType jsonp beforeSend function xhr var base64 b
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 数组反序列化的Gson数组

    我有以下 JSON 结构 id 1 subcategories id 2 subcategories id 3 subcategories id 4 subcategories id 5 subcategories 类别的模型类 为简单起见
  • 泽西岛的全局异常处理

    有没有办法在泽西岛进行全局异常处理 我希望有一种方法可以将其放置在实际调用资源的位置 而不是让单个资源具有 try catch 块 然后调用某种方法来清理所有要发送回客户端的异常 这可能吗 如果是这样 怎么办 而不是 在哪里sanitize
  • “JSONArray 文本必须在 null 的第 1 个字符处以 '[' 开头”

    只是想知道这个错误可能意味着什么 我从下面的代码中得到它 try JSONArray jArray new JSONArray result for int i 0 i
  • 按升序对 NSDictionary 进行排序

    我正在尝试排序NSDictionary按升序排列 我正在使用这段代码 NSDictionary valDict self mGetDataDict key rowKey for NSString valueKey in valDict al
  • 使用 Rails 中的 postgres json 字段更新嵌套键

    我一直在尝试更新以下内容 boxes book 2 moving 2 goods to boxes book new 2 moving 2 goods 无需使用正则表达式或在 ruby 中执行此操作 但似乎有点棘手 我想添加新密钥 然后删除
  • Apache Camel 的 JsonMappingException

    我在骆驼路线上遇到以下异常 Caused by com fasterxml jackson databind JsonMappingException No serializer found for class org apache cam
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 解码Json数据数组并插入到mysql

    这个问题可能已经在这里问过 但我尝试搜索找不到它 我有如下 Json 数据 CityInfo CityCode 5599 Name DRUSKININKAI CityCode 2003 Name KAUNAS CityCode 2573 N
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • 如何在 Restful Web 服务中指定一系列数据或多个实体

    要访问 Restful Web 服务中的 User 实例 URL 的结构如下面的curl 请求所示 curl v X GET s BASE URL User customer id json 如果我想指定所有用户实体或对一系列用户实体进行分

随机推荐

  • 基于MATLAB的视频运动目标检测识别

    一 课题介绍 视频图像处理技术广泛用于工业 安全 医疗 管理等领域 运动目标的检测和跟踪是图像处理技术在视频序列图像处理方面的一个重要应用 在航天 交通 机器人视觉 视频监控 公共场所客流数据监测等场合发挥着重要作用 本文介绍了一种基于MA
  • leetcode分类刷题:矩阵顺时针模拟

    1 这种题目是对代码熟练度考察 模拟顺时针建立或访问矩阵 需要注意矩阵是否为方阵 2 具体思路 以圈数为循环条件 每一圈都坚持左闭右开的区间规则 当小的行列值为奇数 最后一圈为一行或一列或一个数字的不完整圈 3 细节 把 起始圈的上下左右边
  • svn linux客户端使用教程,linux svn 客户端安装配置

    1 首先需要安装SVN Ubuntu下的SVN安装十分简单 sudo apt get install subversion 然后根据提示一步一步 就完成了SVN的安装 sudo apt get install subversion subv
  • C++OpenCV(4):图像截取与掩膜操作

    文章首发于我的个人博客 欢迎大佬们来逛逛 OpenCV项目地址及源代码 点击这里 文章目录 图像截取 图像掩膜操作 图像截取 ROI操作 指的是 region of interest 感兴趣区域 我们可以对一张图片的某个感兴趣的部分进行截取
  • 【C++习题笔记】谭浩强C++程序设计(第三版)第五章

    1 用筛法求100之内的素数 筛法又称为筛选法 具体做法是 先把N个自然数按次序排列起来 1不是质数 也不是合数 要划去 第二个数2是质数留下来 而把2后面所有能被2整除的数都划去 2后面第一个没划去的数是3 把3留下 再把3后面所有能被3
  • 中小银行文件共享需求场景下由GPFS迁移至华为企业级NAS存储实践分享

    导读 IBM GPFS是业界成熟的并行文件系统解决方案 在银行业被广泛应用于文件共享等集群场景 但其相对较高的部署和维护门槛 一定程度上不再能适应业务快速部署 灵活管理的需求 随着NAS产品近年来的长足发展 特别是以华为等主流存储厂商为代表
  • es6-模块化

    模块化 利用export导出和import导入实现模块化 一定程度上可以减少代码的冗余 创建一个js文件 内容如下 创建一个html文件 内容如下
  • WSA with Magisk Root安装配置教程(2023.5)

    前言 最近正式走上了安卓逆向的道路 刚开始尝试了各种模拟器 雷电 夜神 及其海外版 并且安装配置了多次magisk 倒不是说这些模拟器的体验有多差 主要还是不能与 Windows Hype V 共存导致无法使用 WSL 这点让我无法接受 s
  • C++中的指针与引用

    写在前面 指针和引用形式上很好区别 但是他们似乎有相同的功能 都能够直接引用对象 对其进行直接的操作 但是什么时候使用指针 什么时候使用引用呢 这两者很容易混淆 在此我详细介绍一下指针和引用 力争将最真实的一面展现给大家 如果我写得不够好
  • Python:Choosing Colormaps in Matplotlib

    Choosing Colormaps in Matplotlib Matplotlib has a number of built in colormaps accessible via matplotlib colormaps There
  • 学习:对抗神经网络 - 恶意软件

    https blog trendmicro com trendlabs security intelligence a machine learning model to detect malware variants 这个是一个博客中的信
  • [网络安全自学篇] 四十六.微软证书安全问题 (上)Windows验证机制及可执行文件签名问题

    在分享本篇文章之前 先简单聊聊我学习网络安全和系统安全的感受 半年来 作为网络安全的初学者 我写了近50篇安全的文章 从Web渗透到CTF 从二进制分析到恶意代码检测 从CVE漏洞还原到木马病毒及论文 但还是觉得自己非常菜 至今未进入安全圈
  • token做自动登录

    token 身份验证 token 前端自动登录 OpenSSL perl软件安装 https blog csdn net sunhuansheng article details 82218678 OpenSSl Perl这个软件安装无要求
  • vs2015安装_VS2015安装教程

    1 vs2015下载地址 https visualstudio microsoft com zh hans downloads 下载完后解压软件后以管理员身份运行右图的文件 2 开始安装后 会出现等待界面 可能需要几分钟 3 初始化安装程序
  • Python的学习笔记案例6--判断密码强度5.0

    本节课主要讲原来分散的方法封装成一个类 使之成为一个整体 方便调用 就是面向对象编程的思想 1 面向过程编程和面向对象编程的区别 面向过程 POP 以程序执行过程为设计流程的编程思想 面向对象 OOP 以事物为中心的编程思想 什么是对象 O
  • 服务器响应的jsp文件,JSP服务器响应

    JSP服务器响应 Response响应对象主要将JSP容器处理后的结果传回到客户端 可以通过response变量设置HTTP的状态和向客户端发送数据 如Cookie HTTP文件头信息等 一个典型的响应看起来就像下面这样 HTTP 1 1
  • OpenSceneGraph-OpenSceneGraph-3.6.5源码编译

    前言 准备 git 不是必须 使用git得到的源码是3 6 5版本的 CMake vs2019 VS017可以 我这里用的vs2019 osg主页 源码下载 Cmake编译源码 编译报错 CMake Warning dev at F Pro
  • SDWebImage 笔记

    SDWebImage托管在github上 https github com rs SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片 具有缓存管理 异步下载 同一个URL下载次数控制和优化等特征 使
  • A股上市有什么条件?A股上市条件有哪些?

    A股的上市条件有这几点 一 资格要求 1 发行人应当是依法设立且合法存续的股份有限公司 经国务院批准 有限责任公司在依法变更为股份有限公司时 可以采取募集设立方式公开发行股票 2 发行人自股份有限公司成立后 持续经营时间应当在3年以上 但经
  • 【Web架构】使用 JSON API 的好处

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