剖析前后端 API 接口参数设计:JSON 数据结构化全攻略
在当今软件开发领域,前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁,其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其易读性和易解析性被广泛应用于前后端 API 接口设计中。本文将深入剖析前后端 API 接口参数设计中的 JSON 数据结构化,涵盖 JSON Schema、API 设计工具、示例数据、分页和错误处理以及数据类型和结构等方面。
一、JSON Schema:定义数据结构与格式的利器
JSON Schema 是一种强大的工具,用于定义 JSON 数据的结构和格式。它允许开发者明确指定数据的属性、类型、数组和对象等,从而确保数据的有效性和一致性。
(一)作用与优势
- 确保数据质量:通过严格定义数据结构,JSON Schema 可以在数据传输过程中进行验证,防止不合法的数据进入系统。
- 提高开发效率:开发人员可以根据 JSON Schema 快速了解数据结构,减少因数据格式不明确而导致的调试时间。
- 增强可维护性:当数据结构发生变化时,只需更新 JSON Schema,而无需在多个地方手动修改代码。
(二)示例展示
以下是一个用户对象的 JSON Schema 示例:
{"type": "object","properties": {"userId": {"type": "integer"},"username": {"type": "string"},"email": {"type": "string","format": "email"}},"required": ["userId", "username", "email"]
}
在这个示例中,定义了一个用户对象,包含 userId
(整数类型)、username
(字符串类型)和 email
(字符串类型且符合邮箱格式)三个字段,并且这三个字段都是必需的。
(三)自定义属性的运用
- patternProperties:可用于定义满足特定正则表达式模式的属性。例如,可以使用
patternProperties
来限制用户名字符串的格式:
{"type": "object","properties": {"username": {"type": "string"}},"patternProperties": {"^user[0-9]+$": {"type": "string"}}
}
在这个示例中,只有以 user
开头后跟数字的字符串才能作为 username
的值。
2. additionalProperties:用于控制是否允许对象中存在未在 properties
中定义的属性。默认情况下,additionalProperties
为 true
,表示允许额外的属性。如果设置为 false
,则不允许对象中存在未定义的属性。例如:
{"type": "object","properties": {"userId": {"type": "integer"},"username": {"type": "string"}},"additionalProperties": false
}
在这个示例中,对象只能包含 userId
和 username
两个属性,不允许有其他未定义的属性。
二、API 设计工具:提升效率的法宝
在 API 设计过程中,合适的工具可以大大提高开发效率。Swagger 和 OpenAPI 规范是两种非常流行的 API 设计工具。
(一)功能详解
- 设计、文档化和测试 REST API:Swagger 和 OpenAPI 规范提供了丰富的功能,开发人员可以使用 JSON 或 YAML 格式编写 API 定义,描述 API 的端点、请求和响应格式、参数等信息。同时,还可以生成详细的 API 文档和测试界面,方便开发人员和用户查看和测试 API。
- 转换器:可以将 API 定义从一种格式转换为另一种格式,便于与不同的工具和平台集成。
- GUI 编辑器:提供可视化的界面,方便开发人员编辑和查看 API 定义。
- 验证器:用于验证 API 定义的正确性,确保符合 OpenAPI 规范。
(二)使用方法示例
首先,使用 JSON 或 YAML 格式编写 API 定义文件。例如:
openapi: 3.0.0
info:title: My APIversion: 1.0.0
paths:/users:get:summary: Get all usersresponses:'200':description: Successful responsecontent:application/json:schema:type: arrayitems:$ref: '#/components/schemas/User'/users/{userId}:get:summary: Get a user by IDparameters:- in: pathname: userIdrequired: trueschema:type: integerresponses:'200':description: Successful responsecontent:application/json:schema:$ref: '#/components/schemas/User'
components:schemas:User:type: objectproperties:userId:type: integerusername:type: stringemail:type: string
然后,可以使用 Swagger UI 等工具根据 API 定义文件生成 API 文档和测试界面。
三、示例数据:清晰理解 API 的关键
在 API 文档中提供成功和失败的响应示例是非常重要的。
(一)重要性阐述
- 帮助开发者正确调用 API:通过查看成功的响应示例,开发人员可以了解 API 返回的数据结构和格式,从而正确地解析和处理数据。
- 预见错误情况:失败的响应示例可以让开发人员了解在调用 API 时可能出现的错误情况,以及错误信息的格式和内容,从而更好地进行错误处理。
- 提高开发效率:示例数据可以让开发人员更快地理解 API 的使用方式,减少开发过程中的调试时间。
(二)具体示例内容
以下是一个用户注册 API 的成功和失败响应示例:
成功响应示例:
{"userId": 1,"username": "newUser","email": "newuser@example.com"
}
失败响应示例(缺少必要字段):
{"error": "Missing required fields","details": {"username": "Username is required","email": "Email is required"}
}
四、分页和错误处理:提升性能与用户体验
在 API 设计中,分页响应和错误处理机制是必不可少的。
(一)分页设计
- 必要性分析
对于返回大量数据的 API,分页可以有效提高性能和用户体验。如果不进行分页,一次性返回大量数据可能会导致网络延迟、服务器负载过高和客户端处理困难等问题。 - 设计方法
- 查询参数:通过查询参数指定每页的大小和当前页码。例如,
/users?page=1&pageSize=10
表示获取第一页,每页包含 10 个用户。 - 响应格式:分页响应通常包含当前页码、每页大小、总页数和数据列表等信息。例如:
{"page": 1,"pageSize": 10,"totalPages": 5,"data": [{"userId": 1,"username": "user1","email": "user1@example.com"},//...]
}
(二)错误处理机制
- 重要性说明
良好的错误处理机制可以确保在出现问题时,API 能够返回明确的错误信息,帮助开发人员快速定位问题。 - 设计要点
错误码和错误信息:为不同类型的错误定义明确的错误码和错误信息。例如,400 表示客户端错误,404 表示资源未找到,500 表示服务器内部错误等。
详细错误信息:在错误响应中可以包含详细的错误信息,帮助开发人员了解错误的具体原因。例如:
{"error": "Invalid request","details": {"field": "username","message": "Username is too short"}
}
统一错误处理:在 API 中使用统一的错误处理机制,确保所有错误都以一致的格式返回。
五、数据类型和结构:确保清晰可读
JSON 数据可以表示为名称 / 值对的集合(对象)或值的有序列表(数组)。在设计 API 接口参数时,需要合理选择数据结构。
(一)JSON 数据结构特点
- 对象:适用于表示具有多个属性的实体。例如,一个用户信息的 JSON 对象可能包含
userId
、username
和email
等字段。 - 数组:适用于表示一组相同类型的元素。例如,一个用户列表的 API 响应可以是一个包含多个用户对象的数组。
(二)合理组织数据结构的方法
- 遵循命名规范:使用有意义的名称来命名属性和对象,遵循统一的命名规范,提高代码的可读性。
- 避免嵌套过深:尽量避免数据结构嵌套过深,以免增加数据解析的复杂性。
- 考虑扩展性:在设计数据结构时,考虑未来可能的扩展需求,预留一些额外的属性或字段,以便在需要时进行扩展。
六、总结
前后端 API 接口参数设计中的 JSON 数据结构化是一个重要的课题。通过使用 JSON Schema 定义数据结构、利用 API 设计工具、提供示例数据、考虑分页和错误处理以及合理组织数据类型和结构等方法,可以有效地设计和实现前后端 API 接口的 JSON 数据结构化,确保数据交换的准确性和高效性。在快速发展的技术环境中,掌握这些设计原则将为开发者带来巨大的优势,提高系统的可维护性和扩展性,提升开发效率和用户体验。
相关文章:
剖析前后端 API 接口参数设计:JSON 数据结构化全攻略
在当今软件开发领域,前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁,其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式&…...
vue3 多种方式接受props,定义ref,reactive
定义props 1 第一种 interface AddType { dialogStudyVisible: boolean; } const props defineProps<AddType>(); 第二种 // const props defineProps({ // dialogStudyVisible:{ // type:Boolean, // default:false // } // }) 第三种 // const …...

逻辑处理器核心指纹修改
navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义: third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…...

如何制作项目网页
一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/,这个就是将论文中的内容或者补充视频放到一个网页上,以更好的展示他们的工作。因此,这里介绍下如何使用前人提供的模板制作我…...
mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 我们的系统应该配置哪些监控报警项? 监控报警系统如何实现自监控? java 老矣,尚能饭否ÿ…...

1、正则表达式
grep匹配 grep用来过滤文本内容,以匹配要查询的结果。 grep root /etc/passwd:匹配包含root的行 -m 数字:匹配几次后停止 -v:取反-i:忽略字符的大小写,默认的,可以不加-n:…...
Airsim安装问题:This project was made with a different version of the Unreal Engine.
本文记录如何在 Ubuntu 18.04 系统中配置 AirSim 和 Unreal Engine 4.27,并成功打开默认的 Blocks 环境项目。 环境说明 系统:Ubuntu 18.04Unreal Engine 版本:4.27AirSim:主分支文件路径: Unreal Engine:…...

java八股-分布式服务的接口幂等性如何设计?
文章目录 接口幂等token Redis分布式锁 原文视频链接:讲解的流程特别清晰,易懂,收获巨大 【新版Java面试专题视频教程,java八股文面试全套真题深度详解(含大厂高频面试真题)】 https://www.bilibili.com/…...

vscode python code runner执行乱码
打开vscode code runner插件配置,如图所示: 然后在setting.json修改运行python的默认命令: 将原来 替换成 "python":"set PYTHONIOENCODINGutf8 && python", 参考:Vscode——python环境输出中文乱…...
Java中的继承详解
在Java编程中,继承(Inheritance)是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承&a…...

kafka进阶_2.存储消息
文章目录 一、存储消息介绍二、副本同步2.1、数据一致性2.2、HW在副本之间的传递 如果想了解kafka基础架构和生产者架构可以参考 kafka基础和 Kafka进阶_1.生产消息。 一、存储消息介绍 数据已经由生产者Producer发送给Kafka集群,当Kafka接收到数据后,…...

如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?
目前市面上主流播放RTSP视频流的方式是用服务器转码方案,这种方案的好处是兼容性更强,可以用于不同的平台,比如:Windows、Linux或者手机端,但是缺点也很明显:延迟高、播放高清或者同时播放多路视频视频容易…...
如何更好地设计SaaS系统架构
SaaS(Software as a Service)架构设计的核心目标是满足多租户需求、支持弹性扩展和高性能,同时保持低成本和高可靠性。一个成功的SaaS系统需要兼顾技术架构、资源利用、用户体验和商业目标。本文从以下几个方面探讨如何更好地设计SaaS系统架构…...

表征对齐在训练DiT模型中的重要性
Diffusion Models专栏文章汇总:入门与实战 前言:训练过DiT模型的读者们肯定有所体会,相比于UNet模型训练难度大了很多,模型不仅很难收敛,而且非常容易训崩,其中一个很重要的原因是没有进行表征对齐…...
Qt中CMakeLists.txt解释大全
Qt从Qt5.15版本开始正式推荐使用CMake进行项目管理。 在Qt 5.15之前,虽然可以使用CMake进行构建,但Qt官方更推荐使用qmake。 然而,从Qt5.15开始,Qt官方正式推荐使用CMake作为主要的构建系统,并在Qt 6中进一步加强了…...
【在 PyTorch 中使用 tqdm 显示训练进度条,并解决常见错误TypeError: ‘module‘ object is not callable】
在 PyTorch 中使用 tqdm 显示训练进度条,并解决常见错误TypeError: module object is not callable 在进行深度学习模型训练时,尤其是在处理大规模数据时,实时了解训练过程中的进展是非常重要的。为了实现这一点,我们可以使用 tq…...

数据结构-堆的实现和应用
目录 1.堆的概念 2.堆的构建 3.堆的实现 4.堆的功能实现 4.1堆的初始化 4.2堆的销毁 4.3堆的插入 4.3.1向上调整 4.4堆的删除 4.4.1向下调整法 编辑4.5取堆顶 5. 向上调整法和向下调整法比较 6.堆的应用 6.1TOP-K问题 6.2TOP-K思路 6.2.1用前n个数据来建堆 6.…...

数据分析的尽头是web APP?
数据分析的尽头是web APP? 在做了一些数据分析的项目,也制作了一些数据分析相关的web APP之后,总结自己的一些想法和大家分享。 1.web APP是呈现数据分析结果的另外一种形式。 数据分析常见的结果是数据分析报告,可以是PPT或者…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第3篇:YOLOv1——YOLO的开山之作】
YOLOv1 1 摘要2 YOLO: You Only Look Once2.1 如何工作2.2 网络架构2.3 训练2.4 优缺点 YOLO系列博文: 【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇:YOLO系列论文、代码和主要优缺点汇总】 ——————————…...
容器和它的隔离机制
什么是容器和它的隔离机制? 容器 是一种轻量化的虚拟化技术,它允许多个应用程序共享同一个操作系统(OS)内核,同时为每个应用程序提供自己的运行环境。容器通过利用 Linux 的内核功能(如 Namespaces 和 Cgr…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...