SpringBoot 统一请求返回的实现

网友投稿 299 2022-12-01


SpringBoot 统一请求返回的实现

目前我们的返回是直接把实体类扔给请求方,这样很不友好,一方面没有统一的格式,二来请求方不知道请求成功与否,没有一个可以判断的东西,也没有说明性的返回。

本篇就来为所有接口提供一个统一的友好返回。

确定返回结构

首先,我们先确定好我们接口返回的格式是什么样的,然后再一步一步实现下面的。

{

"code": 200,

"msg": "ok",

"data": ""

}

code 字段表示状态码,调用方根据该码来作为后续逻辑的依据,比如 code 值为 200 表示操作成功,没有逻辑错误,此时可以提示用户操作成功等;code 值不为 200 表示操作失败,比如为 1001 ,表示用户名已存在,此时前端做一些相应操作。

msg 字段用来充当额外说明,比如上面说的状态为 1001,这里的 msg 就可以是 username exists 这样的说明性文字,帮助调用方更好的理解。

data 字段一般是在 code 值为 200 的时候,返回具体的业务数据,可以是数组,也可以是对象。

创建返回码

根据上面定的返回结构,我们可以把 code 和 msg 字段用枚举类型整合,在项目中创建 common 目录,新建 ApiCode.java 如下代码所示:

package com.foxescap.wxbox.common;

/**

* 全局接口状态码

* @author xfly

*/

public enum ApiCode {

/**

* 通用成功

*/

API_OK(200, "ok"),

/**

* 用户名已存在

*/

API_USERNAME_EXIST(1001, "username exists");

private final int code;

private final String msg;

ApiCode(int code, String msg) {

this.code = code;

this.msg = msg;

}

public int code() {

return this.code;

}

public String getMsg() {

return this.msg;

}

}

之后每有一个不同的错误代码都需要在这里加上,然后调用这里的枚举变量。可能会有点繁琐,但当项目逐渐大起来以后,这样做就能很好的管理状态码。

创建返回类

在项目中创建 common 目录,新建 HttpResponse.java 文件:

package com.foxescap.wxbox.common;

import com.fasterxml.jackson.annotation.jsonPropertyOrder;

import lombok.AllArgsConstructor;

import lombok.Data;

import java.io.Serializable;

/**

* @author xfly

* @param

*/

@Data

@AllArgsConstructor

@JsonPropertyOrder({"code", "msg", "data"})

public class ApiResponse implements Serializable {

private static final long serialVersionUID = 1L;

/**

* 自定义返回码

*/

private int code;

/**

* 自定义返回说明

*/

private String msg;

/**

* 返回数据

*/

private T data;

/**

* 成功返回,无数据

*

* @return 自定义的 ApiResponse 对象

*/

public static ApiResponse success() {

return new ApiResponse<>(ApiCode.API_OK.code(), ApiCode.API_OK.getMsg(), "");

}

/**

* 成功返回,有数据

*

* @param object 返回数据

* @phttp://aramhttp:// 返回数据类型

* @return 自定义的 ApiResponse 对象

*/

public static ApiResponse success(T object) {

return new ApiResponse<>(ApiCode.API_OK.code(), ApiCode.API_OK.getMsg(), object);

}

/**

* 失败返回

*

* @param apiCode 错误码

* @return 自定义的 ApiResponse 对象

*/

public static ApiResponse fail(ApiCode apiCode) {

return new ApiResponse<>(apiCode.code(), apiCode.getMsg(), "");

}

}

使用返回类

我们修改一下 Controller 里面的接口返回,现在不是直接返回实体类了,而是封装成我们的返回类,再返回给调用方:

@GetMapping("/user/{username}")

public ApiResponse findUserByUsername(@PathVariable(name = "username") String username) {

return ApiResponse.success(userService.findByUsername(username));

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java静态代码块加载驱动代码实例
下一篇:Java多种方式实现生产者消费者模式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~