json api_JSON模式在构建和部署API中的作用

json api

什么是JSON模式 ? 它提供了一种描述任何JSON值的结构和属性的彻底方法。 在记录对任何JSON API的请求和响应时,它非常有用。 本文将探讨其在API的软件开发周期中的作用。

记录JSON响应格式

定义数据架构的最明显的用例也许是在记录API响应的结构。

让我们看一看书API的简单响应:

{"title": "The Art of Lying","pages": 412,"is_fiction": true,"status": "published","updated_at": "2017-04-12T23:20:50.52Z"
}

我们可以使用以下JSON模式文档描述这些响应的结构:

{"$schema": "http://json-schema.org/draft-04/schema#""title": "Book","description": "Describes a book in our online database","type": "object","properties": {"title": {"description": "The title of the book""type": "string","minLength": 1},"pages": {"type": "integer","minimum": 1},"is_fiction": {"type": "boolean"},"updated_at": {"type": "string","format": "date-time"}},"additionalProperties": false
}

我们的API使用者可以从上面找到有用的参考资料,以了解哪些字段可用以及它们存储的数据类型。

为了使事情变得更加正式,我们甚至可以添加一个自定义响应标头,其中包含指向我们的架构文档的链接。 这是发送自定义标头PHP示例:

; rel="describedby"');

我强烈建议JSON Schema作者使用此指南,以获取比常规JSON Schema网站上更多的讨论和示例。

记录JSON请求格式

可能比记录响应格式更有价值的是记录请求格式。 您可能会通过反复试验弄清楚响应是什么样的,但是几乎不可能猜测将数据发布到端点时需要哪种格式。

更糟糕的是,没有标准的地方可以链接到必要的架构。 您可以在错误消息中引用架构,但是我们很快就会发现需要一种将JSON架构与路由和请求方法联系起来的组织方法。 这就是为什么我们有用于API的组织工具的原因。

API Blueprint , RAML和Open API Spec (以前称为Swagger )是用于记录API的最常用工具。 它们都提供对JSON Schema定义的支持,尽管程度不同。

注册免费的Codeship帐户

开发人员的理想工作流程

最终,我们开发人员想要的是一个更简单的工作流程。 理想情况下,我们需要一种解决以下问题的解决方案:

  1. 一种真理来源(一个地方更新定义)。 如果我们对于API中涉及的每种数据类型都有JSON模式文档,并且可以从我们的API工具中引用该模式,那么我们将为所有用例完成一个单一的事实来源。 检查!
  2. 快速原型制作。 使用任何一致的API工具都会使我们能够快速进行原型制作。 像Apiary这样的服务会消耗Swagger或API Blueprint文件,并且可以充当模拟API! 一旦您对响应的模式达成共识,前端团队就可以编写用于格式化响应的代码,而后端团队可以针对将获取原始数据并将其返回给客户端的代码进行工作。给定的格式。 检查!
  3. 生成文档。 如果我们有一个结构合理的API路由文档,包括其中的数据结构的JSON模式,那么将标题,描述和示例提取到可读文档中相对容易(是的,有很多工具可以这个)。 检查!
  4. 在发送有效负载之前,先对其进行验证。 JSON模式验证器几乎以每种语言编写。 您可以使用它们在客户端在有效负载发送之前对其进行验证,或者在执行业务逻辑验证之前在服务器端使用它们进行格式验证。 检查!
  5. 根据其文档测试API。 如果我们有一个全面的工具来记录每个路由和方法以及响应或有效负载的JSON模式,那么想象一下遍历已定义的路由并验证它们是否接受和/或返回的对象就可以了。与定义的JSON模式格式匹配。 Dredd是为我们完成此作业的一个NPM软件包:它根据其文档对API进行了验证(当前它支持Swagger和AP​​I蓝图)。 Abao是一个为RAML定义执行此任务的软件包。 检查!
  6. 生成SDK。 每个大型API工具都支持生成SDK代码以访问API。 检查!

考虑到所有这些绿灯,我们似乎生活在开发者的幻想世界中,那里一切完美! 好吧,正如菲尔·斯特金 ( Phil Sturgeon)在他关于该主题的出色文章中打趣的那样,我们“血腥亲密”,但我们还远远不够。

我想指出,任何API工具中最严重的缺点都与该工具实现JSON Schema规范的方式有多彻底。 这并不是说只要API工具完全实现JSON Schema,一切都很棒且完美。 但是,遵循JSON Schema规范可以避免最严重的问题-与解决体系结构上的不可能性相比,我们可以更轻松地解决美学问题。

让我们回顾一下我们的三个主要API工具选项如何帮助或阻碍理想的工作流程。

API蓝图缺点

尽管这是一个受欢迎且受到广泛支持的工具, 但确实可以让您引用JSON模式来指示请求或响应格式,但它确实难以包含多个文件。 当涉及单一真相来源时(上述清单中的项目1),这就构成了一个主要问题。 如果您的两个或多个API端点返回相同模式的响应怎么办? 如果我们想要一个单一的事实来源,那么所有端点都应该引用同一个文件。

有解决此问题的方法-其他人已记录了使用API​​ Blueprint中的多个文件的方法。 JSON Schema已经支持功能强大的$ref关键字,该关键字可以充当“ include”语句,因此,如果API Blueprint可以利用此功能,那就太好了。

拉姆

RAML确实支持通过自己的!includes指令包含多个文件,因此它可以轻松地从多个位置引用同一模式文件。 它还完全支持JSON模式规范及其强大的$ref参数,因此模式可以毫无问题地引用子模式或远程模式。

我所见过的关于RAML的大多数抱怨都与其文档生成的样式有关(上面列表中的第3项),或者它仅以YAML表示而不具有JSON选项,这两者都是肤浅的。 其结构与Swagger的差异很小。

关于RAML唯一令我困惑的是为什么它没有被更广泛地采用。 可以很好地满足我们理想的开发人员工作流程的要求。

昂首阔步及其局限性

不论好坏,Swagger都具有吸引人的元素,因此似乎是风在吹拂的地方。 但是,由于缺乏对JSON Schema标准的支持,它确实遭受了一些无用的限制(您猜对了)。

马上,如果您拥有描述API中所有内容的定义明确且100%有效的JSON Schema文档,则Swagger将不起作用 。 没错:Swagger 2.0仅支持部分 (但不是全部)JSON Schema关键字,并且不能保证Open API 3.0(Swagger的下一个迭代)可以解决所有缺点。 实现一些已经存在多年的JSON Schema功能非常困难,更不用说计划即将发布的新功能了。

由于JSON Schema已经存在了很长时间,因此可以公平地说Swagger在尊重长辈方面做得并不出色。 JSON Schema文档已经充分描述了Swagger规范(及其Open API替代),因此,当车轮明显无法滚动时,重新发明车轮似乎会适得其反。 例如,为什么我们必须依靠气质的在线编辑器来验证我们的模式?

让我们设置一些警告标志,以便您了解一些地雷。 例如,Swagger不允许您的模式声明其写入的JSON模式版本。这是使用$schema关键字完成的,但是Swagger不支持它。

另一个痛苦的缺点是Swagger还不支持可为空字段的概念。 用JSON模式的话,字段可以定义为类型数组例如 {"type": ["string", "null"]} ,以指示可为空的字符串。 如果Swagger遇到这个完全有效的JSON Schema约定,它将被阻塞。 不好!

JSON模式的patternProperties关键字对于通过正则表达式将值映射到模式非常有用,但是您猜到了,Swagger不支持它。

另一个缺点是它缺乏对模式的“ id”(或“ $ id”)属性的支持。 用JSON模式的话来说,模式的ID有点像命名空间,因此可以将引用的模式适当地理解为父模式下的子模式或独立的定义。 因此,如果您引用的模式使用$ref指向另一个模式,请当心! 昂首阔步可能不赞成。 这会使将您的定义分散到多个文件中变得极为困难。 Swagger似乎更喜欢所有可重用的定义都存储在根文档的definitions对象中,但这在处理多文件设置时几乎不可行。

最具挑战性的定义之一是“循环引用”,其中一种数据类型的实例可能包含子属性,这些子属性是同一数据类型的实例。 公平地讲,无论您使用哪种API工具,这都是棘手的,但是当该工具在背后具有对JSON Schema功能的某种偶然支持时,它将变得尤其困难。

归根结底,您可以让Swagger发挥作用,但是您必须在其限制范围内进行操作。 至少,这意味着破坏JSON Schema文档,有时这意味着要任意施加可能无法准确描述您的API的限制。 我们冒着违反神圣清单中第3、4和5项的风险。

随着时间的推移维护您的API定义

无论使用哪种API工具来开发API,最终都需要对其进行维护。 当您的定义分散在多个文件中时,此任务通常会更容易。 RAML轻松支持这一点,而Swagger可以做一些警告。

请参阅有关将Swagger定义拆分为多个文件的本文 。 在探索过程中,我编写了一个Github存储库,其中包含一些多文件Swagger示例 ,您可能会找到一些有用的参考。

测试您的API

只要您的API工具定义了应用程序的路由和方法,就可以简单地遍历它们并访问这些终结点以验证它们是否按照他们说的去做。 如前所述, Dredd和Abao是执行此乏味任务的两个NPM软件包。 主要目标是轻松验证您的API是否达到了预期的效果,如果您正在使用测试驱动的开发(TDD或BDD),它也是一个很好的起点。

摘要

由于Swagger似乎很受欢迎,因此我可能需要花一些时间来考虑RAML或API Blueprint的消失的可能性,但实际上,没有任何一种解决方案能够完全实现我作为开发人员想要的功能(至今)。

我认为我们正处于实现这一目标的风口浪尖,但是只有当其中一种工具完全实现了已经具有丰富功能的JSON Schema标准时,我们才真正拥有我们寻求的自由。 我认为Open API标准正朝着这个方向发展,只要这些工具之一到达那个目的地,我将很乐意在下一个API中使用它。

翻译自: https://www.javacodegeeks.com/2017/11/json-schemas-role-building-deploying-api.html

json api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 中允许键重复的,二叉搜索树的定义是否允许重复键?

许多算法将指定排除重复项 . 例如&#xff0c;MIT算法书中的示例算法通常提供没有重复的示例 . 实现重复(在节点上或在一个特定方向上作为列表)是相当简单的 . )大多数(我见过)将左边的孩子指定为<&#xff0c;将右边的孩子指定为> . 实际上&#xff0c;允许右子节点或左…

mlp神经网络_白天鹅黑天鹅灰天鹅?卷积神经网络帮你搞定识别

全文共3014字&#xff0c;预计学习时长6分钟本文将通过一系列的天鹅图片来解释卷积神经网络&#xff08;CNN&#xff09;的概念&#xff0c;并使用CNN在常规多层感知器神经网络上处理图像。图像分析假设我们要创建一个能够识别图像中的天鹅的神经网络模型。天鹅具有某些特征&am…

Linux 关机/关闭主机/关闭系统/重启系统/注销系统的命令

文章目录一、shutdown二、reboot三、init四、halt五、poweroff六、logout七、systemctl八、Alt PrtSc (SysRq) REISUB九、molly-guard&#xff08;一&#xff09;molly-gurar 是什么&#xff1f;&#xff08;二&#xff09;如何安装 molly guard?一、shutdown 该命令用于断…

java登录界面命令_Java命令行界面(第26部分):CmdOption

java登录界面命令由于Tweet&#xff0c;我了解了本系列中第26个基于Java的功能强大的库&#xff0c;该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的&#xff0c;用于Java 5应用程序的简单注释驱动命令行解析器工具包。” 该项目的副标题是“…

matlab如何添加度,matlab里的模糊工具箱绘制隶属度函数曲线导入到word的方法

在fuzzy logic toolbox里有 fuzzy membershipfunction可以编辑隶属度函数&#xff0c;非常方便&#xff0c;但是我们写论文一般要把相应的曲线导入到word里&#xff0c;怎样将隶属度函数曲线导入到word里呢&#xff1f;本人也苦苦的寻找了好久。。。方法如下&#xff1a;先看看…

pythonista3使用说明_Pythonista中文文档:sound

sound — 音效和音乐播放 sound模块包含在iOS上播放音效和音频文件的功能。 它还可以使用Recorder类从麦克风录制音频文件。 注意: 为了使用Recorder类&#xff0c;你必须允许访问麦克风。首次使用Recorder.record()方法时&#xff0c;系统会自动显示一个对话框。如果你未授权访…

Linux 命令之 hostnamectl -- 查看/修改当前主机的信息

文章目录命令介绍常用选项命令示例&#xff08;一&#xff09;查看当前主机的信息&#xff08;二&#xff09;设置当前主机的名称命令介绍 hostnamectl 可用于查询和更改系统主机名和相关设置。此工具区分三种不同的主机名&#xff1a; 高级“漂亮”主机名&#xff0c;其中可…

getopt java_Java命令行界面(第28部分):getopt4j

getopt javagetopt4j的页面将其描述为“一个根据GNU样式解析命令行参数的库。” 然后&#xff0c; 页面介绍getopt4j &#xff1a;“getopt4j库旨在以与glibc &#xff08;GNU C运行时库&#xff09;中的C getopt&#xff08;&#xff09;函数相同的方式解析命令行选项。 与原始…

matlab 返回变量类型的命令,MATLAB主要命令汇总

MATLAB主要命令汇总1、常用信息help:在线帮助(显示在命令窗)。helpwin:在线帮助(独立窗口显示)。ver:MATLAB及工具箱的版本信息。2、管理工作区命令who:显示当前变量。whos:显示当前变量具体信息。clear:从内存中清楚变量和函数。quit:退出MATLAB。3、管理命令和函数what:显示当…

springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

优质文章&#xff0c;及时送达作者 | wangzaiplus链接 | www.jianshu.com/p/6189275403ed一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能…

语言代号/地区代号/国家代号

国家/地区语言代码简体中文(中国)zh-cn繁体中文(台湾地区)zh-tw繁体中文(香港)zh-hk英语(香港)en-hk英语(美国)en-us英语(英国)en-gb英语(全球)en-ww英语(加拿大)en-ca英语(澳大利亚)en-au英语(爱尔兰)en-ie英语(芬兰)en-fi芬兰语(芬兰)fi-fi英语(丹麦)en-dk丹麦语(丹麦)da-dk英…

java 示例_功能Java示例 第2部分–讲故事

java 示例这是称为“ Functional Java by Example”的系列文章的第2部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一部分中&#xff0c;我从一些原始代码开始&#xff0c;并应用了一些重构来描述“什么”而不是“如何”。 …

python如何读取文件内容求和_使用python对文件中的数值进行累加的实例

问题描述&#xff1a; 一个文件由若干条记录组成&#xff0c;记录的格式为&#xff1a;“num1 num2”&#xff0c;有时候&#xff0c;需要统计文件中num1对应的num2的总值。 处理问题的思路 用传说中的python来处理&#xff0c;很方便。几行代码就可以了。 处理思路&#xff1a…

基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现

频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法&#xff0c;其相同之处&#xff1a;(1)DIF与DIT两种算法均为原位运算。(2)DIF与DIT运算量相同。不同之处&#xff1a;(1)DIF的算法结构是将DIT算法结构倒过来。 DIF为输入顺序&#xff0c;输出乱序。运算…

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;显示当前的本地化设置与键盘映射&#xff08;二&#xff09;设置系统的本地化字符集环境变量&#xff08;三&#xff09;列出本地所有字符集&#xff08;四&#xff09;列出所有可用的控制台键盘映射&#xff08;五…

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解&#xff08;一&#xff09;查看当前 locale 设置&#xff08;二&#xff09;查看当前系统所有可用 locale&#xff08;三&#xff09;设置系统的 locale命令介绍 locale 是 Linux 系统中多语言环境的设置接口&#xff0c;在 Linux 中…

python range函数范围_Python range函数

Python range函数教程 range函数详解 语法 range(start, stop[, step]) 参数 参数 描述 start 计数从 start 开始。默认是从 0 开始。 stop 计数到 stop 结束&#xff0c;但不包括 stop。 step 步长&#xff0c;默认为1&#xff0c;可以支持负数。 返回值 返回生成的序列。 案例…

php sapi globals,PhP 常见安装错误

ext/iconv/.libs/iconv.o: In function php_iconv_stream_filter_ctor’:/home/king/php-5.2.13/ext/iconv/iconv.c:2491: undefined reference to libiconv_open’collect2: ld returned 1 exit statusmake: *** [sapi/cli/php] Error 1[roottest php-5.2.13]# vi Makefile在安…

openpyxl删除添加excel列_Python | 如何使用Python操作Excel(二)

0 前言在阅读本文之前&#xff0c;请确保您已满足或可能满足一下条件&#xff1a;请确保您具备基本的Python编程能力。请确保您会使用Excel。请确保您的电脑已经安装好Python且pip可用。请确保您已经读过前文&#xff1a;如何使用Python操作Excel(一)LogicPanda&#xff0c;公众…

Linux 命令之 timedatectl -- 查看系统当前时区设置

timedatectl命令用于查看当前时区设置。 # 查看当前时区设置 $ timedatectl# 显示所有可用的时区 $ timedatectl list-timezones # 设置当前时区 $ sudo timedatectl set-timezone Americ…