掌握RESTful API:规范与设计详解
前言
RAML (RESTful API Modeling Language) 和 OAS (OpenAPI Specification) 都是用于描述和定义 RESTful API 的规范。它们分别提供了不同的功能和优势。
RAML(RESTful API Modeling Language):
RAML简介
RAML(RESTful API Modeling Language)是一种用于描述和建模 RESTful API 的规范语言。它提供了一种简洁和易于理解的方式来定义和文档化 API 的结构、行为和元数据。
它 不仅仅是一种标记语言,它还是一种设计工具,帮助开发团队以可读性强、一致性好的方式构建 API。RAML 的主要目标是提供一种简单的方式,使开发人员可以理解和使用 API,同时为团队成员、合作伙伴和其他开发者提供详细的文档和说明。
RAML格式说明
在 RAML 中,使用以下关键元素来描述 RESTful API:
- 资源(Resource):表示 API 中的基础对象或概念。
- 方法(Method):表示可以在资源上执行的操作,例如 GET、POST、PUT、DELETE 等。
- 请求(Request):定义发送到 API 的请求的格式和内容。这包括请求头、请求体、请求参数等。
- 响应(Response):定义 API 对请求的响应的格式和内容。这包括响应状态码、响应头和响应体等。
- 参数(Parameter):用于描述请求或响应中的参数,例如查询参数、路径参数等。
RAML 还支持使用注释和示例来提供额外的信息和示例数据。这些注释和示例可以用于解释 API 的行为和用途,以及展示如何在实际情况中使用 API。
OAS(OpenAPI Specification):
OSA简介
OpenAPI Specification(OAS),也称为Swagger规范,是一种用于描述和定义 RESTful API 的规范语言。它提供了一种标准化的方式来描述 API 的结构、行为和元数据,并支持生成互动式文档、代码以及进行自动化测试和部署。
OAS 通过使用 JSON 或 YAML 格式的文档来描述 API 的各个方面,如路径、参数、请求体、响应和错误等。它定义了一组规范和约定,使得开发团队和开发者能够更好地理解和使用 API。
OAS格式
OAS 是另一种用于描述和定义 RESTful API 的规范。与 RAML 类似,OAS 提供了一种易于理解和一致性的语法,以便开发人员能够清楚地了解 API 的行为和功能。OAS 是基于 Swagger 规范开发的,它提供了一套全面的规范,包括定义 API 的各个方面的功能。
在 OAS 中,你可以使用以下关键元素来描述 RESTful API:
- 路径(Path):表示 API 中的基础 URL 和端点。
- 请求(Request):定义发送到 API 的请求的格式和内容,包括请求方法、请求头、请求体等。
- 响应(Response):定义 API 对请求的响应的格式和内容,包括响应状态码、响应头和响应体等。
- 参数(Parameter):用于描述请求或响应中的参数,例如查询参数、路径参数等。
- 注释(Comment):用于提供额外的信息和解释 API 的行为和用途。
- 示例(Example):用于展示如何在实际情况中使用 API,并提供示例数据。
RAML和OAS(OpenAPI Specification)的区别
RAML和OAS都是用于描述和定义RESTful API的规范,但它们有一些不同之处:
-
格式:RAML使用自己的格式和语法,而OAS使用JSON或YAML格式。RAML的格式相对更简洁,易于编辑和阅读,而OAS的JSON和YAML格式更为通用和标准化。
-
可读性:RAML具有良好的可读性和可理解性,它使用简洁且自然的语法来描述API的组件(如资源、方法、参数等)和关系。OAS的JSON和YAML格式相对较冗长,可读性较差。
-
版本支持:RAML有多个版本,当前较新的版本是RAML 1.0。OAS也有多个版本,其中OAS 3.0是较新和广泛使用的版本。
-
扩展性:RAML在设计上更加灵活和可扩展。它支持自定义标记和注释,并且有一个模块化的设计,使得可以轻松定义和重用API组件。OAS在设计上较为规范,扩展性相对较差。
-
生态系统和工具支持:OAS在行业中更为常见和广泛使用,拥有更强大和丰富的生态系统和工具支持。许多常见的API工具和平台都提供对OAS的良好支持,如Swagger、Postman和Apigee等。相比之下,RAML的工具和平台支持相对较少。
需要注意的是,RAML和OAS之间并没有明确的优劣之分。选择使用哪种规范取决于个人或团队的偏好、项目要求和工具生态系统支持等因素。在选择之前,建议对它们的语法、特性和生态系统进行深入了解,并考虑与你的项目需求和团队背景相匹配的因素。
RESTful API 规范使用个人建议
1. 遵循行业普遍标准
选择一种广泛使用的 API 规范,如 OpenAPI Specification (OAS) 或 RAML。这些标准提供了一套共享的语法和结构,能够使团队成员更容易理解和协作。
选择一种广泛的规范,主要是为了减少团队新人的学习曲线;规范的社区力量,方便后续升级。
2. 保持设计一致性
确保团队中的每个人都遵循相同的 API 设计风格和规则。
制定一套统一的命名约定、URI 结构、HTTP 方法使用、错误处理等准则,以保持 API 的一致性和易用性。
3. 遵循RESTful 架构原则
遵循 RESTful 架构原则,例如使用无状态的通信、资源的合适表达和标识、合理的 URI 设计、适当的 HTTP 方法选择等。这能帮助开发者更好地理解和使用 API。
4. 良好的API 文档和描述
使用规范的 API 文档工具,如 Swagger、ReDoc 或 RAML 等,为 API 提供详细的文档和描述。这样能够方便其他团队成员了解 API 的能力、参数、示例和用法等。
5. 做好版本管理
为 API 引入版本管理,以便在进行重大变更时能够保持向后兼容性。这可以通过在 URI 或请求头中包含版本号来实现,并在文档中记录每个版本的变更历史和支持情况。
6. 注意安全性和权限控制
确保 API 具备适当的安全性和权限控制机制。使用标准的身份验证和授权方法,如 OAuth 2.0,以保护敏感数据和资源。同时,限制和管理 API 的访问权限,确保只有经过身份验证和授权的用户才能使用相关功能。
建议不要在非开发环境开放。
7. 定义清晰的错误处理和状态码
定义清晰的错误处理机制和标准的 HTTP 状态码,以便开发者能够准确理解和处理 API 调用过程中的各种结果和异常情况。
8. 引入接口版本和退化策略
引入 API 的退化策略,以确保对于旧版本的客户端仍然能够有效地使用并提供必要的支持。这可能涉及废弃和删除旧版本的 API,或是提供适当的延期通知和迁移指南。
9. 性能和缓存机制
优化 API 的性能和响应时间,使用适当的缓存策略和技术来减轻服务器负载,并提供合理的缓存控制头部以支持客户端缓存。
10. 持续改进
不断进行 API 规范的评估和改进。与开发人员、测试团队和 API 使用者保持密切的反馈和沟通,收集意见和建议,以进一步优化 API 规范和设计。
总结
每个团队的需求和情况可能有所不同,因此可以根据实际情况进行调整和扩展。始终将可读性、一致性、易用性和安全性等原则置于设计的核心,并遵循行业标准和最佳实践。
始终要记得一件事:呈现出来的东西都是要给人看的,如果团队成员不好理解或者说协作效率下降,那么它就不适合。 没有最好的,只有最适合的。
相关文章:

掌握RESTful API:规范与设计详解
前言 RAML (RESTful API Modeling Language) 和 OAS (OpenAPI Specification) 都是用于描述和定义 RESTful API 的规范。它们分别提供了不同的功能和优势。 RAML(RESTful API Modeling Language): RAML简介 RAML(RESTful API M…...

「更新」Topaz Video AI v4.0.3中文版
Topaz Video AI是一款功能强大的视频处理软件,它利用人工智能技术对视频进行智能分析和优化,旨在为用户提供高效、智能的视频编辑和增强功能。 首先,Topaz Video AI具备强大的视频修复功能。它可以自动识别并修复视频中的各种问题࿰…...

OpenAI最新官方GPT最佳实践指南,一文讲清ChatGPT的Prompt玩法
原文:Sina Visitor System OpenAI的官网发表万字GPT最佳实践指南,讲清Prompt提示词的原则和策略,这里是总结和全文翻译 原创图像,AI辅助生成 OpenAI的官网上刚刚发表一篇万字的GPT最佳实践指南,这份指南把写好Promp…...

树结构及其算法-用链表来实现二叉树
目录 树结构及其算法-用链表来实现二叉树 C代码 树结构及其算法-用链表来实现二叉树 以链表实现二叉树就是使用链表来存储二叉树,也就是运用动态分配内存和指针的方式来建立二叉树。 使用链表来表示二叉树的好处是节点的增加与删除操作相当容易,缺点…...
openwrt(三):在hostapd获取已关联的STA的MAC地址
在深度开发openwrt的hostapd模块的时候,有些功能的实现需要获取已关联的sta的mac地址,下面是相关的方法描述: 第一、在sta_info.c文件中,可以找到一个名为struct hostap_sta_info * hostapd_get_sta(struct hostapd_data *hapd, …...

为何袁世凯要把“元宵节”改为“上元节”?
网民把春节除夕日排除在法定假期之外的相关热议,在微博评论区部分已被关闭。官方学者的解释是:“回归传统。” 这就令人难免要回顾历史,并发觉只有在袁世凯称帝之后,才有过取消“元宵节”改为“上元节”的笑话,因为“元…...

python将图片序列保存成gif
这里用到的模块是imageio。用imageio.mimsave即可将图片序列保存成gif动态图。以下是本人编写的小实验: import cv2 import imageiopaths ["./images/0001.png", "./images/0002.png", "./images/0003.png", ...] frames [] for i…...
UE4用C++修改蓝图对象的属性值
if (auto Property FindFProperty<FStrProperty>(Class, "A")){Object->Modify();Property->SetPropertyValue_InContainer(Object.GetClass(), "OK");}...

供应商等级:一级、二级和三级供应商之间有什么区别
作为一名专业采购人员,你知道拥有一个可靠且具有成本效益的供应链有多么重要。确保供应链顺利运行的方法之一就是利用供应商分级。 什么是供应商分级? 供应商分级是根据供应商的绩效和对企业的重要性,对其进行分类的做法。 因此,…...
软考 系统架构设计师系列知识点之净室软件工程(3)
接前一篇文章:软考 系统架构设计师系列知识点之净室软件工程(2) 所属章节: 第5章. 软件工程基础知识 第5节. 净室软件工程 相关试题 1. 以下关于软件开发方法的叙述,错误的是()。 A. 对于较为…...
『VUE H5页面 - PDF预览』
使用依赖:vue-pdf实现需求:将 PDF url 地址 转换为本地页面预览 <template><div class"pdf-preview"><NavBar /><div class"container"><VuePdf v-for"i in numPages" :key"i" cla…...

使用lua-resty-request库编写爬虫IP实现数据抓取
目录 一、lua-resty-request库介绍 二、使用lua-resty-request库进行IP数据抓取 1、获取IP地址 2、设置请求 3、处理数据 三、代码实现 四、注意事项 五、总结 本文将深入探讨如何使用lua-resty-request库在爬虫程序中实现IP数据抓取。我们将首先介绍lua-resty-request…...

vue-admin-templete项目配置在手机上预览
参考文档: https://blog.csdn.net/qq_29752857/article/details/109802801想要在手机上预览本地打开的vue-admin-templete项目,首先要确保手机和电脑在同一网段。 参考文档:https://blog.csdn.net/m0_57236802/article/details/1315234471.查…...

服务号升级订阅号的流程
服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务,每月可推送4次,每次最多8篇文章,发送的消息直接显示在好友列表中。订阅号更侧重于信息传…...
redhat7.4 安装lnmp操作环境
PacVim安装 https://baijiahao.baidu.com/s?id1601033830453371540&wfrspider&forpc 安装php https://www.cnblogs.com/alliancehacker/p/12255445.html https://blog.csdn.net/weixin_39709920/article/details/104274545 安装mysql https://www.cnblogs.com/laumian…...
Java判断是否有特殊字符串
//特殊字符串过滤private static String REGEX_RULE "[ _~!#$%^&*()|{}:;,\\[\\].<>/?~!#¥%……&*()——|{}【】‘;:\"”“’。,、?]|\n|\r|\t";pri…...

服务器搭建:从零开始创建自己的Spring Boot应用【含登录、注册功能】
当然,你可以先按照IDEA搭建SSM框架【配置类、新手向】完成基础框架的搭建 步骤 1:设计并实现服务器端的用户数据库 在这个示例中,我们将使用MySQL数据库。首先,你需要安装MySQL并创建一个数据库以存储用户信息。以下是一些基本步…...

家用小型洗衣机哪款性价比高?公认好用四款内衣洗衣机推荐
小型的内衣洗衣机由于体积小巧,而且实用,非常适合没有太多空闲时间的上班族以及小型住户的使用。想要挑选到一款能够满足每日清洗需要,同时拥有便携与高效率的小型内衣洗衣机,也许会让你选择得有些烦恼。我们为大家挑选了一些性价…...

Sui zkSend,创建链接可直接发送SUI,快来体验吧
基于zkLogin和Sui的本机密码学构建,zkSend允许用户创建包含特定数量SUI的链接。该链接可以通过任何消息客户端发送,例如电子邮件和直接消息,甚至可以在媒体上转换成QR码。 使用zkSend发送SUI比复制和粘贴钱包地址,然后授权token转…...

SQL面试
#(1)请写出要查询员工J开头的名字其工号(EMPNO)及部门名称(DEPTNA)的 SQL语句SELECT e.emp,e.name,d.deptna FROM emp e left join dept d on d.deptno e.deptno where e.name like J%#(2)请写出要查询 Kevin 所在部门的部门代号(DEPTNO)及部门名称(DEPTNA)的 SQL 语句SELECT e…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...