Spring Boot接口设计规范
接口参数处理及统一结果响应
1、接口参数处理
1、普通参数接收
这种参数接收方式是比较常见的,由于是GET请求方式,所以在传参时直接在路径后拼接参数和参数值即可。
例如:localhost:8080/api/product/list?key1=value1&key2=value2
/*** 商品列表 - 普通参数接收* @return 统一返回对象*/@RequestMapping(value = "/product/list",method = RequestMethod.GET)public Result list(@RequestParam(required = false) String goodsStatus,@RequestParam(required = false) String goodName,@RequestParam(required = false) Integer pageNum,@RequestParam(required = false) Integer pageSize){// 业务逻辑略....
}
2、路径参数接收
在开发过程中会出现部分接口设计时采用将参数拼入路径中的方式,当只需要一个参数时,可以考虑路径参数接收这种接口设计方式。这种请求方式与普通参数接收方式没有很大的区别,个人习惯。。。
例如:像根据订单号查询,这个时候可以将接口设计成/product/1024,在接口方法的参数列表中使用@PathVariable注解对订单号进行接收。
/*** 根据商品id获取商品详情* @return 统一返回对象*/@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)public Result goods(@PathVariable("id") Integer productId){// 业务逻辑略....
}
3、对象参数接收
在进行接口开发的过程中,项目中的POST或者PUT方法类型的接口,基本上都是以对象形式来接收参数的。
例如在登录接口中,前端在请求体中传递JSON格式的请求参数,后端使用@RequestBody注解对前端传递过来的JSON数据进行接收,并将参数转换成对应的实体类。
@RequestMapping(value = "/admin/login", method = RequestMethod.POST)public Result<String> login( @RequestBody @Valid AdminLoginParam adminLoginParam){// 业务逻辑略....
}
AdminLoginParam
@Data
public class AdminLoginParam implements Serializable {@NotEmpty(message = "登录名不能为空")private String userName;@NotEmpty(message = "密码不能为空")private String password;
}
这样当前端通过调用/admin/login接口,并传递如下json数据给后端,后端就会接收并处理登录流程了。
{"username" : "panpan","password" : "123123"
}
为了统一数据格式,前端传递数据的过程中,需要统一在请求头中将Content-Type设置为application/json
4、复杂对象接收
在开发过程中避免不了会出现一些复杂的对象,这些复杂对象往往都是一个对象中包含另外一个实体对象,或者包含一组对象(List params)
这种复杂对象接收方式与对象参数接收的方式一样,前端在传递的时候只需要在json串中嵌套一层json对象。后端接收参数时封装一个嵌套对象即可
@PostMapping("/saveOrder")public Result<String> saveOrder(@Parameter(description = "订单参数") @RequestBody SaveOrderParam saveOrderParam){// 业务逻辑略....
}
SaveOrderParam
@Data
public class SaveOrderParam implements Serializable {// 订单项id数组private Long[] cartItemIds;// 地址idprivate Long addressId;
}
2、统一结果响应
为了保证所有接口响应数据格式的统一,这样可以大大减少接口响应的工作量,方便前端同学使用接口。
/*** 统一返回对象** @author supanpan* @create_date 2023-11-19 11:03*/
public class Result<T> implements Serializable {private static final long serialVersionUID = 1L;//业务码,比如成功、失败、权限不足等 code,可自行定义private int resultCode;//返回信息,后端在进行业务处理后返回给前端一个提示信息,可自行定义private String message;//数据结果,泛型,可以是列表、单个对象、数字、布尔值等private T data;public Result() {}public Result(int resultCode, String message) {this.resultCode = resultCode;this.message = message;}public int getResultCode() {return resultCode;}public void setResultCode(int resultCode) {this.resultCode = resultCode;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "Result{" +"resultCode=" + resultCode +", message='" + message + '\'' +", data=" + data +'}';}
}
封装响应结果生成工具类
/*** 响应结果生成工具** @author supanpan* @create_date 2023-11-19 11:05*/
public class ResultGenerator {private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";private static final String DEFAULT_FAIL_MESSAGE = "FAIL";private static final int RESULT_CODE_SUCCESS = 200;private static final int RESULT_CODE_SERVER_ERROR = 500;public static Result genSuccessResult() {Result result = new Result();result.setResultCode(RESULT_CODE_SUCCESS);result.setMessage(DEFAULT_SUCCESS_MESSAGE);return result;}public static Result genSuccessResult(String message) {Result result = new Result();result.setResultCode(RESULT_CODE_SUCCESS);result.setMessage(message);return result;}public static Result genSuccessResult(Object data) {Result result = new Result();result.setResultCode(RESULT_CODE_SUCCESS);result.setMessage(DEFAULT_SUCCESS_MESSAGE);result.setData(data);return result;}public static Result genFailResult(String message) {Result result = new Result();result.setResultCode(RESULT_CODE_SERVER_ERROR);if (!StringUtils.hasText(message)) {result.setMessage(DEFAULT_FAIL_MESSAGE);} else {result.setMessage(message);}return result;}public static Result genErrorResult(int code, String message) {Result result = new Result();result.setResultCode(code);result.setMessage(message);return result;}
}
使用示例:
/*** 商品列表* @return 统一返回对象*/@RequestMapping(value = "/product/list",method = RequestMethod.GET)public Result list(@RequestParam(required = false) String goodsStatus,@RequestParam(required = false) String goodName,@RequestParam(required = false) Integer pageNum,@RequestParam(required = false) Integer pageSize){// 返回数据对象Object resultData = new Object();return ResultGenerator.genSuccessResult(resultData);}
相关文章:
Spring Boot接口设计规范
接口参数处理及统一结果响应 1、接口参数处理 1、普通参数接收 这种参数接收方式是比较常见的,由于是GET请求方式,所以在传参时直接在路径后拼接参数和参数值即可。 例如:localhost:8080/api/product/list?key1value1&key2value2 /…...

美创科技与南京大数据安全技术有限公司达成战略合作
近日,美创科技与南京大数据安全技术有限公司正式签署战略合作协议,优势力量共享、共拓共创共赢。 美创科技CEO柳遵梁、副总裁罗亮亮、副总裁王利强,南京大数据安全技术有限公司总经理潘杰、市场总监刘莉莎、销售总监王皓月、技术总监薛松等出…...
2.4路由日志管理
2.4路由/日志管理 一、静态路由和动态路由 路由器在转发数据时,需要现在路由表中查找相应的路由,有三种途径 (1)直连路由:路由器自动添加和自己直连的路由 (2)静态路由:管理员手动…...

归并排序详解:递归实现+非递归实现(图文详解+代码)
文章目录 归并排序1.递归实现2.非递归实现3.海量数据的排序问题 归并排序 时间复杂度:O ( N * logzN ) 每一层都是N,有log2N层空间复杂度:O(N),每个区间都会申请内存,最后申请的数组大小和array大小相同稳定…...

DataBinding原理
1、MainActivity首先使用DataBindingUtil.setContentView设置布局文件activity_main.xml。 2、随后,经过一系列函数调用,ActivityMainBindingImpl对象最终会实例化,并与activity_main.xml进行绑定。 3、实例化后的ActivityMainBindingImpl对象…...

docker更换国内源
docker更换国内源 1、编辑Docker配置文件 在终端中执行以下命令,编辑Docker配置文件: vi /etc/docker/daemon.json2、添加更新源 在打开的配置文件中,添加以下内容: {"registry-mirrors": ["https://hub-mirror…...

【咖啡品牌分析】Google Maps数据采集咖啡市场数据分析区域分析热度分布分析数据抓取瑞幸星巴克
引言 咖啡作为一种受欢迎的饮品,已经成为我们生活中不可或缺的一部分。随着国内外咖啡品牌的涌入,新加坡咖啡市场愈加多元化和竞争激烈。 本文对新加坡咖啡市场进行了全面的品牌门店数占比分析,聚焦于热门品牌的地理分布、投资价值等。通过…...

【Java】异常处理(一)
🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:什么都不做,才会来不及 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 📋前…...

【高级程序设计】Week2-4Week3-1 JavaScript
一、Javascript 1. What is JS 定义A scripting language used for client-side web development.作用 an implementation of the ECMAScript standard defines the syntax/characteristics of the language and a basic set of commonly used objects such as Number, Date …...
PHP笔记-->读取JSON数据以及获取读取到的JSON里边的数据
由于我以前是写C#的,现在学一下PHP, 在读取json数据的时候被以前的思维卡住了。 以前用C#读取的时候,是先定义一个数组,将反序列化的json存到数组里面,在从数组里面获取jaon中的“data”数据。 其实PHP的思路也是一样…...
【Spring Boot】如何集成Redis
在pom.xml文件中导入spring data redis的maven坐标。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 在application.yml文件中加入redis相关配置。 spr…...

Elasticsearch备份与还原:使用elasticdump
在数据管理的世界里,备份和还原数据是重中之重的日常工作,特别是对于Elasticsearch这样的强大而复杂的搜索引擎。备份不仅可以用于灾难恢复,还可以在数据迁移、测试或者升级等场景中发挥重要作用。 在本博客中,我们将会重点介绍如…...

给大伙讲个笑话:阿里云服务器开了安全组防火墙还是无法访问到服务
铺垫: 某天我在阿里云上买了一个服务器,买完我就通过MobaXterm进行了ssh(这个软件是会保存登录信息的) 故事开始: 过了n天之后我想用这个服务器来部署流媒体服务,咔咔两下就部署好了流媒体服务器&#x…...
js:react使用zustand实现状态管理
文档 https://www.npmjs.com/package/zustandhttps://github.com/pmndrs/zustandhttps://docs.pmnd.rs/zustand/getting-started/introduction 安装 npm install zustand示例 定义store store/index.js import { create } from "zustand";export const useCount…...

vue3+vite+SQL.js 读取db3文件数据
前言:好久没写博客了,最近一直在忙,没时间梳理。最近遇到一个需求是读取本地SQLite文件,还是花费了点时间才实现,没怎么看到vite方面写这个的文章,现在分享出来完整流程。 1.pnpm下载SQL.js(什么都可以下)…...

微信小程序 限制字数文本域框组件封装
微信小程序 限制字数文本域框 介绍:展示类组件 导入 在app.json或index.json中引入组件 "usingComponents": {"text-field":"/pages/components/text-field/index"}代码使用 <text-field maxlength"500" bindtabsIt…...

阿里国际站(直通车)
1.国际站流量 2.直通车即P4P(pay for performance点击付费) 2.1直通的含义:按点击付费,通过自助设置多维度展示产品信息,获得大量曝光吸引潜在买家。 注意:中国大陆和尼日利尼地区点击不扣费。 2.2扣费规…...
C# GC机制
在C#中,垃圾回收(Garbage Collection,简称GC)是CLR(公共语言运行时)的一个重要部分,用于自动管理内存。它会自动释放不再使用的对象所占用的内存,避免内存泄漏,减少程序员…...

wpf devexpress在未束缚模式中生成Tree
TreeListControl 可以在未束缚模式中没有数据源时操作,这个教程示范如何在没有数据源时创建tree 在XAML生成tree 创建ProjectObject类实现数据对象显示在TreeListControl: public class ProjectObject {public string Name { get; set; }public string Executor {…...
Python利器:os与chardet读取多编码文件
在数据处理中会遇到读取位于不同位置的文件,每个文件所在的层级不同,而且每个文件的编码类型各不相同,那么如何高效地读取文件呢? 在读取文件时首先需要获取文件的位置信息,然后根据文件的编码类型来读取文件。本文将使用os获取文件路径,使用chardet得到文件编码类型。 …...
微服务和注册中心
微服务和注册中心是紧密相关的概念,可以说注册中心是微服务架构中必不可少的一部分。 在微服务架构中,系统被拆分成了若干个独立的服务,因此服务之间需要进行通信和协作。为了实现服务的发现和调用,需要一个中心化的注册中心来进…...

吴恩达《机器学习》9-1-9-3:反向传播算法、反向传播算法的直观理解
一、正向传播的基础 在正向传播中,从神经网络的输入层开始,通过一层一层的计算,最终得到输出层的预测结果。这是一种前向的计算过程,即从输入到输出的传播。 二、反向传播算法概述 反向传播算法是为了计算代价函数相对于模型参数…...

Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 链表的创建 2.0 判断回文链表说明 2.1 快慢指针方法 2.2 使用递归方式实现反转链表方法 2.3 实现判断回文链表 - 使用快慢指针与反转链表方法 3.0 判断环链表说明…...
【JS】Chapter13-构造函数数据常用函数
站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 (十三)构造函数&数据常用函数 1. 深入对象 1.1 创建对象三种方式 利用对象字面量创建对象const o {…...
06-流媒体-YUV数据在SDL控件显示
整体方案: 采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流 客户端:RTMP拉流->解封装(FLV转H264)…...
对象和数据结构
文章目录 前言一、从链式调用说起二、数据抽象三、数据、对象的反对称性四、得墨忒尔律五、数据传送对象总结 前言 代码整洁之道读书随笔,第六章 一、从链式调用说起 面向对象语言中常用的一种调用形式,链式调用,是一种较受推崇的编码风格&…...

ESP32-BLE基础知识
一、存储模式 两种存储模式: 大端存储:低地址存高字节,如将0x1234存成[0x12,0x34]。小端存储:低地址存低字节,如将0x1234存成[0x34,0x12]。 一般来说,我们看到的一些字符串形式的数字都是大端存储形式&a…...

vscode终端npm install报错
报错如下: npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…...
雪花算法的使用
雪花算法的使用(工具类utils) import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;// 雪花算法 Component public class SnowflakeUtils { // Generated ID: 1724603634882318341; // Generated ID: 1724603…...
flink源码分析之功能组件(一)-metrics
简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metric,future。其中kubeclient上一个系列介绍过,本系列不在介绍。 本文介绍flink metrics组件,metric…...