使用通用的响应格式

使用泛型响应类(或者类似的响应封装类)在网络编程和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.mfbz.cn/a/754913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPU算力是什么,哪些行业需要用到GPU算力?

近两年&#xff0c;计算能力已成为推动各行各业发展的关键因素。而GPU&#xff08;图形处理器&#xff09;算力&#xff0c;作为现代计算技术的重要分支&#xff0c;正逐渐在多个领域展现出其强大的潜力和价值。尚云将简要介绍GPU算力的定义和基本原理&#xff0c;并探讨其在哪…

对于CDA一级考试该咋准备??!

一、了解考试内容和结构 CDA一级考试主要涉及的内容包括&#xff1a;数据分析概述与职业操守、数据结构、数据库基础与数据模型、数据可视化分析与报表制作、Power BI应用、业务数据分析与报告编写等。 CDA Level Ⅰ 认证考试大纲:https://edu.cda.cn/group/4/thread/174335 …

从架构设计的角度分析ios自带网络库和AFNetworking

总结&#xff08;先说明文章分析出的一些‘认知’&#xff09; 从本文中&#xff0c;我们可以总结出一些框架设计上的“认知”&#xff1a; 对于通用的常规配置信息方面的设计&#xff0c;我们可以通过定义一个“类似于NSURLSessionConfiguration、NSURLRequest”的类来完成设…

Python | Leetcode Python题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def removeElements(self, head: ListNode, val: int) -> Li…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…

[Go Web] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

正版软件 | R-Drive Image:数据安全守护者,您的智能备份专家

在数字化时代&#xff0c;数据安全的重要性不言而喻。R-Drive Image 是一款功能强大的备份和恢复软件&#xff0c;为您提供了全面的解决方案&#xff0c;确保您的数据安全无忧。 精确备份&#xff0c;全面保护 R-Drive Image 能够创建硬盘驱动器的逐字节副本&#xff0c;无论是…

RabbitMQ 的经典问题

文章目录 前言一、防止消息丢失1.1 ConfirmCallback/ReturnCallback1.2 持久化1.3 消费者确认消息 二、防止重复消费三、处理消息堆积四、有序消费消息五、实现延时队列六、小结推荐阅读 前言 当设计和运维消息队列系统时&#xff0c;如 RabbitMQ&#xff0c;有几个关键问题需…

机器人控制系列教程之控制理论概述

经典控制理论 经典控制理论主要研究线性定常系统。所谓线性控制系统是指系统中各组成环节或元件的状态由线性微分方程描述的控制系统。如果描述该线性系统的微分方程系数是常数,则称为线性定常系统。描述自动控制系统输入量、输出量和内部量之间关系的数学表达式称为系统的数学…

夏令营1期-对话分角色要素提取挑战赛-第①次打卡

零基础入门大模型技术竞赛 简介&#xff1a; 本次学习是 Datawhale 2024 年 AI 夏令营第一期&#xff0c;学习活动基于讯飞开放平台“基于星火大模型的群聊对话分角色要素提取挑战赛”开展实践学习。 适合想 入门并实践大模型 API 开发、了解如何微调大模型的学习者参与 快来…

【RNN练习】LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前期准备工作 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1. 导入数据 data pd.read_cs…

[Leetcode刷题] - 栅栏涂漆DP类问题

题目描述 这一类题目通常会问给定一组房子n和一组染料k去涂漆&#xff0c;并且会加入限制条件比如&#xff1a;某种颜色只能使用1次&#xff0c;相相邻房子不能涂同一种颜色&#xff0c;或者最多不能超过连续3个房子涂想通过颜色等等&#xff0c;让我们列举所有可能性总和&…

如何评估CRM客户系统的功能是否满足助贷机构的需求?

评估 CRM 客户系统的功能是否满足助贷机构的需求&#xff0c;可以从以下几个方面入手&#xff1a; 1. 客户信息管理 - 检查系统能否全面、准确地记录客户的基本信息&#xff0c;如个人身份、财务状况、贷款需求等。 - 确认是否支持多维度的客户分类和标签功能&#xff0c;以…

STM32第七课:KQM6600空气质量传感器

文章目录 需求一、KQM6600模块及接线方法二、模块配置流程1.环境2.配置时钟和IO3.配置串口初始化&#xff0c;使能以及中断4.中断函数 三、数据处理四、关键代码总结 需求 能够在串口实时显示当前的VOC&#xff08;挥发性有机化合物&#xff09;&#xff0c;甲醛和Co2浓度。 …

css 流动边框

一、背景流动边框 实现原理&#xff1a; 用背景进行旋转&#xff0c;超出我们想显示的范围则hidden&#xff0c;就有以上的效果&#xff0c;可以用after或者before元素来实现也可以。 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

【开发环境】MacBook M2安装git并拉取gitlab项目,解决gitlab出现Access Token使用无效的方法

文章目录 安装Homebrew安装git打开IDEA配置git打开IDEA拉取项目 安装Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"在iTerm等命令行工具打开后&#xff0c;输入上面的命令 之后根据中文提示完成Homebrew的下载…

web项目打包成可以离线跑的exe软件

目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时&#xff0c;我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标&#xff0c;其中 pywebview 是一个轻量级的库&#xff0c;它允许我们…

PyScript:在浏览器中释放Python的强大

PyScript&#xff1a;Python代码&#xff0c;直接在网页上运行。- 精选真开源&#xff0c;释放新价值。 概览 PyScript是一个创新的框架&#xff0c;它打破了传统编程环境的界限&#xff0c;允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…

把飞书云文档变成HTML邮件:问题挑战与解决历程

一、背景 云文档转HTML邮件 基于公司内部的飞书办公套件&#xff0c;早在去年6月&#xff0c;我们就建设了将飞书云文档转译成HTML邮件的能力&#xff0c;方便同学们在编写邮件文档和发送邮件时&#xff0c;都能有较好的体验和较高的效率。 当下问题 要被邮件客户端识别&am…

【蓝桥杯省赛真题46】python数字币统计 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python数字币统计 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python数字币统计 第十四届蓝桥杯青少年组python比赛省赛真题 一、题目…