当前位置: 首页 > news >正文

剖析前后端 API 接口参数设计:JSON 数据结构化全攻略

        在当今软件开发领域,前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁,其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其易读性和易解析性被广泛应用于前后端 API 接口设计中。本文将深入剖析前后端 API 接口参数设计中的 JSON 数据结构化,涵盖 JSON Schema、API 设计工具、示例数据、分页和错误处理以及数据类型和结构等方面。

一、JSON Schema:定义数据结构与格式的利器

        JSON Schema 是一种强大的工具,用于定义 JSON 数据的结构和格式。它允许开发者明确指定数据的属性、类型、数组和对象等,从而确保数据的有效性和一致性。

(一)作用与优势

  1. 确保数据质量:通过严格定义数据结构,JSON Schema 可以在数据传输过程中进行验证,防止不合法的数据进入系统。
  2. 提高开发效率:开发人员可以根据 JSON Schema 快速了解数据结构,减少因数据格式不明确而导致的调试时间。
  3. 增强可维护性:当数据结构发生变化时,只需更新 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(字符串类型且符合邮箱格式)三个字段,并且这三个字段都是必需的。

(三)自定义属性的运用

  1. 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 设计工具。

(一)功能详解

  1. 设计、文档化和测试 REST API:Swagger 和 OpenAPI 规范提供了丰富的功能,开发人员可以使用 JSON 或 YAML 格式编写 API 定义,描述 API 的端点、请求和响应格式、参数等信息。同时,还可以生成详细的 API 文档和测试界面,方便开发人员和用户查看和测试 API。
  2. 转换器:可以将 API 定义从一种格式转换为另一种格式,便于与不同的工具和平台集成。
  3. GUI 编辑器:提供可视化的界面,方便开发人员编辑和查看 API 定义。
  4. 验证器:用于验证 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 文档中提供成功和失败的响应示例是非常重要的。

(一)重要性阐述

  1. 帮助开发者正确调用 API:通过查看成功的响应示例,开发人员可以了解 API 返回的数据结构和格式,从而正确地解析和处理数据。
  2. 预见错误情况:失败的响应示例可以让开发人员了解在调用 API 时可能出现的错误情况,以及错误信息的格式和内容,从而更好地进行错误处理。
  3. 提高开发效率:示例数据可以让开发人员更快地理解 API 的使用方式,减少开发过程中的调试时间。

(二)具体示例内容

        以下是一个用户注册 API 的成功和失败响应示例:

成功响应示例:

{"userId": 1,"username": "newUser","email": "newuser@example.com"
}

失败响应示例(缺少必要字段):

{"error": "Missing required fields","details": {"username": "Username is required","email": "Email is required"}
}

四、分页和错误处理:提升性能与用户体验

        在 API 设计中,分页响应和错误处理机制是必不可少的。

(一)分页设计

  1. 必要性分析
    对于返回大量数据的 API,分页可以有效提高性能和用户体验。如果不进行分页,一次性返回大量数据可能会导致网络延迟、服务器负载过高和客户端处理困难等问题。
  2. 设计方法
  • 查询参数:通过查询参数指定每页的大小和当前页码。例如,/users?page=1&pageSize=10 表示获取第一页,每页包含 10 个用户。
  • 响应格式:分页响应通常包含当前页码、每页大小、总页数和数据列表等信息。例如:
{"page": 1,"pageSize": 10,"totalPages": 5,"data": [{"userId": 1,"username": "user1","email": "user1@example.com"},//...]
}

(二)错误处理机制

  1. 重要性说明
    良好的错误处理机制可以确保在出现问题时,API 能够返回明确的错误信息,帮助开发人员快速定位问题。
  2. 设计要点
    错误码和错误信息:为不同类型的错误定义明确的错误码和错误信息。例如,400 表示客户端错误,404 表示资源未找到,500 表示服务器内部错误等。
    详细错误信息:在错误响应中可以包含详细的错误信息,帮助开发人员了解错误的具体原因。例如:
{"error": "Invalid request","details": {"field": "username","message": "Username is too short"}
}

        统一错误处理:在 API 中使用统一的错误处理机制,确保所有错误都以一致的格式返回。

五、数据类型和结构:确保清晰可读

        JSON 数据可以表示为名称 / 值对的集合(对象)或值的有序列表(数组)。在设计 API 接口参数时,需要合理选择数据结构。

(一)JSON 数据结构特点

  1. 对象:适用于表示具有多个属性的实体。例如,一个用户信息的 JSON 对象可能包含 userIdusername 和 email 等字段。
  2. 数组:适用于表示一组相同类型的元素。例如,一个用户列表的 API 响应可以是一个包含多个用户对象的数组。

(二)合理组织数据结构的方法

  1. 遵循命名规范:使用有意义的名称来命名属性和对象,遵循统一的命名规范,提高代码的可读性。
  2. 避免嵌套过深:尽量避免数据结构嵌套过深,以免增加数据解析的复杂性。
  3. 考虑扩展性:在设计数据结构时,考虑未来可能的扩展需求,预留一些额外的属性或字段,以便在需要时进行扩展。

六、总结

        前后端 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接口定义&#xff1a; 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/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

随笔 从千万粉丝“何同学”抄袭开源项目说起&#xff0c;为何纯技术死路一条&#xff1f; 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 我们的系统应该配置哪些监控报警项&#xff1f; 监控报警系统如何实现自监控? java 老矣&#xff0c;尚能饭否&#xff…...

1、正则表达式

grep匹配 grep用来过滤文本内容&#xff0c;以匹配要查询的结果。 grep root /etc/passwd&#xff1a;匹配包含root的行 -m 数字&#xff1a;匹配几次后停止 -v&#xff1a;取反-i&#xff1a;忽略字符的大小写&#xff0c;默认的&#xff0c;可以不加-n&#xff1a…...

Airsim安装问题:This project was made with a different version of the Unreal Engine.

本文记录如何在 Ubuntu 18.04 系统中配置 AirSim 和 Unreal Engine 4.27&#xff0c;并成功打开默认的 Blocks 环境项目。 环境说明 系统&#xff1a;Ubuntu 18.04Unreal Engine 版本&#xff1a;4.27AirSim&#xff1a;主分支文件路径&#xff1a; Unreal Engine&#xff1a…...

java八股-分布式服务的接口幂等性如何设计?

文章目录 接口幂等token Redis分布式锁 原文视频链接&#xff1a;讲解的流程特别清晰&#xff0c;易懂&#xff0c;收获巨大 【新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;】 https://www.bilibili.com/…...

vscode python code runner执行乱码

打开vscode code runner插件配置&#xff0c;如图所示&#xff1a; 然后在setting.json修改运行python的默认命令&#xff1a; 将原来 替换成 "python":"set PYTHONIOENCODINGutf8 && python", 参考&#xff1a;Vscode——python环境输出中文乱…...

Java中的继承详解

在Java编程中&#xff0c;继承&#xff08;Inheritance&#xff09;是一种面向对象编程&#xff08;OOP&#xff09;的核心概念&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff08;称为父类或基类&#xff09;的属性和方法。通过继承&a…...

kafka进阶_2.存储消息

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

如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?

目前市面上主流播放RTSP视频流的方式是用服务器转码方案&#xff0c;这种方案的好处是兼容性更强&#xff0c;可以用于不同的平台&#xff0c;比如&#xff1a;Windows、Linux或者手机端&#xff0c;但是缺点也很明显&#xff1a;延迟高、播放高清或者同时播放多路视频视频容易…...

如何更好地设计SaaS系统架构

SaaS&#xff08;Software as a Service&#xff09;架构设计的核心目标是满足多租户需求、支持弹性扩展和高性能&#xff0c;同时保持低成本和高可靠性。一个成功的SaaS系统需要兼顾技术架构、资源利用、用户体验和商业目标。本文从以下几个方面探讨如何更好地设计SaaS系统架构…...

表征对齐在训练DiT模型中的重要性

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;训练过DiT模型的读者们肯定有所体会&#xff0c;相比于UNet模型训练难度大了很多&#xff0c;模型不仅很难收敛&#xff0c;而且非常容易训崩&#xff0c;其中一个很重要的原因是没有进行表征对齐&#xf…...

Qt中CMakeLists.txt解释大全

‌Qt从Qt5.15版本开始正式推荐使用CMake进行项目管理‌。 在Qt 5.15之前&#xff0c;虽然可以使用CMake进行构建&#xff0c;但Qt官方更推荐使用qmake。 然而&#xff0c;从Qt5.15开始&#xff0c;Qt官方正式推荐使用CMake作为主要的构建系统&#xff0c;并在Qt 6中进一步加强了…...

【在 PyTorch 中使用 tqdm 显示训练进度条,并解决常见错误TypeError: ‘module‘ object is not callable】

在 PyTorch 中使用 tqdm 显示训练进度条&#xff0c;并解决常见错误TypeError: module object is not callable 在进行深度学习模型训练时&#xff0c;尤其是在处理大规模数据时&#xff0c;实时了解训练过程中的进展是非常重要的。为了实现这一点&#xff0c;我们可以使用 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&#xff1f; 在做了一些数据分析的项目&#xff0c;也制作了一些数据分析相关的web APP之后&#xff0c;总结自己的一些想法和大家分享。 1.web APP是呈现数据分析结果的另外一种形式。 数据分析常见的结果是数据分析报告&#xff0c;可以是PPT或者…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第3篇:YOLOv1——YOLO的开山之作】

YOLOv1 1 摘要2 YOLO: You Only Look Once2.1 如何工作2.2 网络架构2.3 训练2.4 优缺点 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】 ——————————…...

容器和它的隔离机制

什么是容器和它的隔离机制&#xff1f; 容器 是一种轻量化的虚拟化技术&#xff0c;它允许多个应用程序共享同一个操作系统&#xff08;OS&#xff09;内核&#xff0c;同时为每个应用程序提供自己的运行环境。容器通过利用 Linux 的内核功能&#xff08;如 Namespaces 和 Cgr…...

【数据结构与算法】排序算法总结:冒泡 / 快排 / 直接插入 / 希尔 / 简单选择 / 堆排序 / 归并排序

1 排序 1.1 冒泡 内排序的交换排序类别 1.1.1 普通实现 public class BubbleSort {/*** 基本的 冒泡排序*/public static void bubbleSort(int[] srcArray) {int i,j; // 用于存放数组下标int temp 0; // 用于交换数值时临时存放值for(i0;i<srcArray.length-1;i){// j …...

Windows Serv 2019 虚拟机 安装Oracle19c,图文详情(超详细)

1、下载安装文件 Oracle官网下载直链&#xff1a;https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 夸克网盘下载&#xff1a;https://pan.quark.cn/s/1460a663ee83 2、新建 Windows Server 2019 虚拟机 &#xff08;超详细&a…...

数字孪生开发之 Three.js 插件资源库(2)

在当今数字化快速发展的时代&#xff0c;数字孪生技术正逐渐成为各个领域的关键技术之一。它通过创建物理实体的虚拟副本&#xff0c;实现对实体的实时监测、模拟和优化&#xff0c;为企业和组织带来了诸多好处&#xff0c;如提高生产效率、降低成本、改进产品质量等。然而&…...

小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)

指针和引用的区别?怎么实现的? 指针和引用有以下一些主要区别。 从概念上来说,指针是一个变量,它存储的是另一个变量的地址。可以通过指针来间接访问所指向的变量。例如,我们定义一个整型指针int *p;,它可以指向一个整型变量的内存地址。而引用是一个别名,它必须在定义的…...

OpenOCD之J-Link下载

NOTE&#xff1a;此篇文章由笔者的 VSCode编辑GCC for ARM交叉编译工具链Makefile构建OpenOCD调试&#xff08;基于STM32的标准库&#xff09;派生而来。 1.下载USB Dirver Tool.exe&#xff0c;选择J-Link dirver&#xff0c;替换成WinUSB驱动。&#xff08;⭐USB Dirver Tool…...

华为云云连接+squid进行正向代理上网冲浪

1 概述 ‌Squid‌是一个高性能的代理缓存服务器&#xff0c;主要用于缓冲Internet数据。它支持多种协议&#xff0c;包括FTP、gopher、HTTPS和HTTP。Squid通过一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求&#xff0c;这使得它在处理请求时具有较高的效率‌。…...

情绪识别项目

文章目录 1、mp4s文件转mp3文件2、Audition下载3、Audition安装4、Audition使用&#xff1a; 1、mp4s文件转mp3文件 在线转&#xff1a;Convert audio to MP3&#xff08;https://audio.online-convert.com/convert-to-mp3&#xff09; 2、Audition下载 Audition CC2019/64位…...

【RISC-V CPU debug 专栏 2.2 -- Hart DM States】

文章目录 Hart DM StatesHart 的 DM 状态1. 不存在(Non-existent)2. 不可用(Unavailable)3. 运行(Running)4. 暂停(Halted)状态转换与复位行为状态指示信号Hart DM States 在 RISC-V 调试架构中,每个可以被选择的硬件线程(hart)处于以下四种调试模块(DM)状态之一…...

从零样本到少样本学习:一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用!

爆款标题&#xff1a; 《从零样本到少样本学习&#xff1a;一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用&#xff01;》 正文&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Zero-shot、One-shot 和 Few-shot 学习已经成为衡量大语言…...

【LC】3101. 交替子数组计数

题目描述&#xff1a; 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 …...

广西城乡建设委员会的网站/怎么联系百度客服

原文&#xff1a;https://jingyan.baidu.com/article/5bbb5a1b634cca53eba179ce.html 首先说一下密码必须是6~18位之间的数字&#xff0c;正则表达式为"^[0-9]{6,18}$"&#xff0c;其中[0-9]表示必须是数字&#xff0c;{6,18}表示必须在6到18位之间&#xff0c;代码如…...

为什么有的公司做很多个网站/深圳网络推广公司排名

1、简单介绍该错误发生的背景&#xff1a; 1&#xff09; 数据库版本&#xff1a;MySQL5.7.19 2&#xff09; 对一个大表修改字段类型DDL&#xff08;将主键id int变为bigint&#xff09;&#xff0c;为了不影响主库业务&#xff0c;先在从库上执行DDL操作&#xff0c;然后通过…...

江门那里做公司网站好/seo关键词排名优化系统

Segmentation Fault (core dumped)&#xff0c;段错误 输入命令&#xff1a;gcc 文件名 -g &#xff0c;后按回车 (意思是添加一个gdb调试手段)输入命令 &#xff1a;gdb 编译后的文件名&#xff0c;后按回车 &#xff08;这时会出现一堆字符&…...

小程序推广网站/百度网络推广怎么收费

中石油校内的比赛&#xff0c;只能后续补题了&#xff0c;题目来说还是比较的不错 A 数方格&#xff08;思维&#xff09; 规定了都是正方形&#xff0c;那么枚举就可以一行的按照规律也好枚举列数也好枚举 代码 #include <bits/stdc.h> using namespace std; int main()…...

做网站是什么鬼/2024年小学生简短小新闻

夜光序言&#xff1a; 后来才明白&#xff0c;要赚到足够令自己安心的钱&#xff0c;才能过上简单、安逸、自由的生活&#xff0c;才能让自己活得更有底气。所以&#xff0c;多花时间努力&#xff0c;少点功夫矫情。 正文&#xff1a; 比如说&#xff1a;一个人A为父类&#x…...

昆明网站建设方案报价/北京百度推广排名优化

美团 一面&#xff1a; 1、ConcurrentHashMap实现原理 2、HashMap实现原理 3、锁的实现原理 4、synchronized和重入所实现原理以及区别 5、一个char[]数组&#xff0c;里面有空格&#xff0c;以&结束。 6、jvm内存模型&#xff0c;都存什么。以及垃圾回收算法&#xff0c;…...