使用通用的响应格式

使用泛型响应类(或者类似的响应封装类)在网络编程和API设计中有很多好处,包括但不限于以下几点:

统一响应格式

使用R<T>可以确保API的所有响应都遵循相同的格式,这有助于客户端更容易地解析和处理响应。客户端可以预期响应中总是包含codemsgdata这三个字段,从而简化了错误处理和数据提取的逻辑。

清晰的状态码和信息

通过code字段,客户端可以明确地知道请求是否成功,以及可能发生了什么错误。msg字段提供了关于错误的更多详细信息,有助于客户端开发者调试和解决问题。

类型安全

由于R<T>是一个泛型类,它可以接受任何类型的data。这意味着你可以根据API的需求返回任何类型的数据,同时保持类型安全性。这减少了类型转换和运行时错误的可能性。

可扩展性

如果你需要添加额外的响应字段或修改现有的字段,只需在R<T>类中进行修改即可。所有使用该类的API都会自动继承这些更改,而无需修改每个API的响应逻辑。

简化客户端代码

由于响应格式是统一的,客户端可以编写通用的代码来处理所有API的响应。这减少了代码的冗余和复杂性,提高了可维护性。

错误处理的中心化

通过在R<T>类中定义错误处理逻辑(例如,将状态码映射到具体的错误信息),你可以将错误处理逻辑集中在一个地方,而不是分散在每个API的实现中。这有助于保持代码的一致性和可维护性。

更好的文档和沟通

使用R<T>可以更容易地向其他开发者(包括客户端开发者)解释API的响应格式和可能的错误情况。这有助于减少误解和沟通成本。

向后兼容性

如果将来需要修改API的响应格式或添加新的字段,使用R<T>可以更容易地实现向后兼容性。你可以逐步淘汰旧的字段或添加新的字段,而不会破坏现有客户端的功能。

java实现代码:

使用枚举类设置一下状态码

这是最简单 的状态码只有1和0可以自行添加更加详细的状态码例如"10"和"11"代表用户模块,"20"和"21"代表其他模块等等

// 使用枚举来定义状态码
public enum ResponseCode {SUCCESS(1, "操作成功"),FAILURE(0, "操作失败");private final int code;private final String message;ResponseCode(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

定义泛型响应结果类


// 泛型响应类
public class R<T> {private int code; // 使用枚举代替硬编码的数字private String msg; // 错误信息,使用枚举的message作为默认值private T data; // 数据//getter和setter省略......// 静态方法返回成功时候的R对象public static <T> R<T> success(T data) {R<T> r = new R<>();r.data = data;r.code = ResponseCode.SUCCESS.getCode();r.msg = ResponseCode.SUCCESS.getMessage(); // 使用枚举的message作为默认信息return r;}// 静态方法返回失败时传入消息public static <T> R<T> error(String msg) {R<T> r = new R<>();r.code = ResponseCode.FAILURE.getCode();r.data = null;r.msg = msg;return r;}//在失败时返回额外的数据public static <T> R<T> errorWithData(String msg, T data) {R<T> r = new R<>();r.code = ResponseCode.FAILURE.getCode();r.data = data;r.msg = msg;return r;}}

这里添加了三个字段三个静态方法,可以根据需求自行添加字段和静态方法

具体业务代码使用

import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  import java.util.Arrays;  
import java.util.List;  @RestController  
@RequestMapping("/api/users")  
public class UserController {  // 模拟的用户数据服务层方法  private List<User> getUserList() {  // 在真实场景中,这里会从数据库或其他数据源获取数据  return Arrays.asList(  new User(1, "Alice"),  new User(2, "Bob")  );  }  // 获取用户列表的API端点  @GetMapping("/list")  public R<List<User>> getUserListApi() {  try {  List<User> users = getUserList();  if (users != null && !users.isEmpty()) {  // 成功时返回数据  return R.success(users);  } else {  // 没有用户时,也可以视为一种失败情况,但这里仅作为示例返回成功  return R.success(Arrays.asList());  }  } catch (Exception e) {  // 发生异常时返回错误信息  return R.error("获取用户列表失败");  }  }  // User类定义(仅作为示例)  static class User {  private Integer id;  private String name;  // 省略构造函数、getter和setter...  }  
}

在这个例子中,UserController有一个getUserListApi方法,它调用getUserList方法获取用户列表,并根据结果创建并返回一个R<List<User>>对象。如果获取用户列表成功,则返回状态码为成功的响应;如果发生异常或没有用户(尽管在这个例子中我们视为成功),则返回状态码为失败的响应。

客户端在调用/api/users/list端点时,会收到一个包含codemsgdata字段的JSON响应,这样客户端就可以根据这些字段来解析和处理响应了。

{  "code": 1, "msg": "操作成功",  "data": [  {  "id": 1,  "name": "Alice"  },  {  "id": 2,  "name": "Bob"  }  ]  
}

如果getUserListApi方法在处理过程中发生异常或没有返回任何用户(但在这里我们假设即使没有用户也返回成功状态),并且你选择了返回空的用户列表而不是失败状态,那么JSON响应可能是这样的:

{  "code": 1,  "msg": "操作成功", "data": [] 
}

然而,如果你选择在没有用户时返回失败状态,并使用R.error方法,那么JSON响应可能会是这样的:

{  "code": 0, "msg": "没有用户数据", "data": null   
}

使用泛型响应类R<T>是一种提高API可靠性、可维护性和易用性的有效方法,有助于简化客户端代码的开发和调试过程。

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

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

相关文章

IP地址与在线教育平台资源分配优化

IP地址的资源分配与优化策略可以帮助在线教育平台提供更高质量、稳定且个性化的教育服务。 IP地址作为网络设备的标识符&#xff0c;能够为在线教育平台提供有关学生地理位置和网络环境信息。通过对学生IP地址的分析&#xff0c;平台可以初步了解学生所在的地区、网络服务提供商…

回收站的照片删除了怎么找回?

大家在日常使用电脑的过程中&#xff0c;难免会遇到不小心删除重要文件的情况&#xff0c;尤其是珍贵的照片。当我们意识到误删照片时&#xff0c;第一反应通常是去回收站找回。然而&#xff0c;如果连回收站的照片都被删除了&#xff0c;该如何恢复呢&#xff1f;本文将详细探…

【MySQL】事务的快照生成时间点和薛定谔的猫相关?

概述 最近因为工作需要&#xff0c;对MySQL的事务处理进行了一系列测试验证&#xff0c;其中&#xff0c;对于MySQL的事务到底时什么时候生成了数据的快照&#xff0c;结果似乎跟薛定谔的猫理念很像&#xff0c;很有意思&#xff1b;过程我贴出来&#xff0c;有兴趣的朋友可以一…

Python提供API给JAVA调用,实现Python和Java之间的交互

一、Java 调用Python 提供的API接口&#xff0c;有多种方法&#xff0c;本文通过Python 提供的Rest API进行调用 二、在Python中创建一个REST API&#xff0c;你可以使用许多框架&#xff0c;其中两个最流行的框架是Flask和Django REST framework。这两个框架都提供了创建REST…

Dockerfile详情,Django项目中使用Dockerfile

Dockerfile详情&#xff0c;Django项目中使用Dockerfile 目录 Dockerfile详情&#xff0c;Django项目中使用Dockerfile介绍常用指令Dokcerfile部署Django项目安装Docker获取项目源码Dockerfile文件构建Docker镜像运行Docker容器 介绍 Dockerfile是一个文本文件&#xff0c;一般…

simulink开发stm32,使用中断模块,无法产生中断,其中包括使用timer模块,以及ADC都无法产生中断,需要注意的地方

1&#xff0c;其中包括使用timer模块&#xff0c;以及ADC都无法产生中断&#xff0c;需要注意的地方 原来是需要在配置文件里开启一下timer的中断&#xff0c;其他模块自动加载ioc就可以了&#xff0c;这个timer需要注意力&#xff0c;需要自己勾选一下 如下图&#xff1a; 看…

提升 Selenium 测试稳定性的秘诀:深入理解等待 API 的使用

目录 为什么需要等待Selenium 等待 API 简介隐式等待显式等待Fluent Wait等待策略的选择示例代码总结 正文 1. 为什么需要等待 在 Web 自动化测试中&#xff0c;等待是一个关键因素。网络应用通常是动态的&#xff0c;页面加载时间、元素的显示时间都可能不同步。直接操作这…

致敬经典:在国产开源操作系统 RT-Thread 重温 UNIX 彩色终端

引言 上篇文章里我们向大家介绍了 RT-Thread v5.1.0 的一些新特性。其中包括了终端环境的进一步完善。终端是人机交互的重要接口。实用的终端工具可以显著地提升系统使用者的幸福指数。举例来说&#xff0c;当我们想要修改一些系统配置&#xff0c;或是编写脚本时&#xff0c;一…

Linux——echo命令,管道符,vi/vim 文本编辑器

1.echo 命令 作用 向终端设备上输出字符串或变量的存储数据 格式 echo " 字符串 " echo $ 变 量名 [rootserver ~] # echo $SHELL # 输出变量的值必须加 $ /bin/bash [rootserver ~] # str1" 我爱中国 " # 自定义变量 echo 重定向输出到文件 ec…

MySQL数据库——在Centos7环境安装

MySQL在Centos7环境安装 1.切换root用户 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;安装好后&#xff0c;普通用户也能使用 2.卸载不要的环境 要将自己环境中有关mysql的全都删除&#xff0c;避免安装过程中被影响 ps axj | grep mariadb 先检查是否有mari…

近似最近邻查找的几种方法

近似最近邻查找 定义主要方法1. 局部敏感哈希&#xff08;LSH&#xff09;2. KD树&#xff08;k-d tree&#xff09;3. 球树&#xff08;Ball Tree&#xff09;4. 随机投影树&#xff08;Random Projection Trees&#xff09;5. 图结构方法&#xff08;Graph-Based Methods&…

自制全网最便宜的雷达感应灯光画,成本只需5元

自制全网最便宜的雷达感应灯光画&#xff0c;成本5元 ​ 成本组成&#xff1a;带热释电的人体感应灯&#xff08;0.5元&#xff09;雷达感应模块&#xff08;3.5元&#xff09;首饰盒&#xff08;0.45元&#xff09;微喷油画布&#xff08;1元&#xff09;5.45元 ​ 说一下做灯…

Flutter学习:从搭建环境到运行

一、开发环境的搭建 本文所示内容都是在Windows系统下进行的。 1、下载 Flutter SDK Flutter 官网&#xff08;https://docs.flutter.cn/release/archive?tabwindows&#xff09; 或者通过 git clone -b master https://github.com/flutter/flutter.git 下载 2、配置环境…

[数据集][目标检测]井盖未盖好检测数据集VOC+YOLO格式20123张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;20123 标注数量(xml文件个数)&#xff1a;20123 标注数量(txt文件个数)&#xff1a;20123 标…

Gamepad API 控制游戏的 JavaScript 指南

在现代网页游戏中&#xff0c;通过游戏手柄来控制游戏是一种常见的需求。HTML5 提供了一个名为 Gamepad API 的接口&#xff0c;使得从浏览器中读取游戏手柄输入变得相对简单。 什么是 Gamepad API&#xff1f; Gamepad API 是 HTML5 的一部分&#xff0c;允许开发者通过 Jav…

.net 奇葩问题调试经历之2——内存暴涨,来自非托管的内存泄露

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 这是一个序列文章,请看以往文…

AI推介-信息抽取(information extraction,NER)论文速览(arXiv方向):2023.11.15-2023.12.31

文章目录&#xff5e; 1.Large Language Models for Generative Information Extraction: A Survey2.Commonsense for Zero-Shot Natural Language Video Localization3.Unified Lattice Graph Fusion for Chinese Named Entity Recognition4.Solving Label Variation in Scien…

代码统计工具V1.0.0(支持各种文件类型)

点击下载《代码统计工具&#xff08;支持各种文件类型&#xff09;》 1. 前言 本文介绍了一款使用C#开发的代码行数统计软件。该软件允许用户通过选择文件目录和设置统计项目类型&#xff0c;来统计指定目录下的代码行数。软件提供了三种统计方式&#xff1a;按文件名统计、按…

线性图标绘制指南:从基础到精通

图标在生活中随处可见。相比文字来说&#xff0c;图标可以让人在更短的时间内认知并了解信息&#xff0c;并且大大提升信息的视觉美观性&#xff0c;增加设计的艺术感染力。在用户界面中使用图标&#xff0c;是一种用户熟知的设计模式。而线性图标是通过提炼图形轮廓&#xff0…

jquery动态插件之gsap和TextPlugin

<!DOCTYPE html> <html> <head><title>数字化人才认证数动画</title><script src"https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script src"https://cdnjs.cloudflare.com/ajax…