目前我们的返回是直接把实体类扔给请求方,这样很不友好,一方面没有统一的格式,二来请求方不知道请求成功与否,没有一个可以判断的东西,也没有说明性的返回。
本篇就来为所有接口提供一个统一的友好返回。
确定返回结构
首先,我们先确定好我们接口返回的格式是什么样的,然后再一步一步实现下面的。
{
"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 <T>
*/
@Data
@AllArgsConstructor
@JsonPropertyOrder({"code", "msg", "data"})
public class ApiResponse<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 自定义返回码
*/
private int code;
/**
* 自定义返回说明
*/
private String msg;
/**
* 返回数据
*/
private T data;
/**
* 成功返回,无数据
*
* @return 自定义的 ApiResponse 对象
*/
public static ApiResponse<Object> success() {
return new ApiResponse<>(ApiCode.API_OK.code(), ApiCode.API_OK.getMsg(), "");
}
/**
* 成功返回,有数据
*
* @param object 返回数据
* @param <T> 返回数据类型
* @return 自定义的 ApiResponse 对象
*/
public static <T> ApiResponse<T> success(T object) {
return new ApiResponse<>(ApiCode.API_OK.code(), ApiCode.API_OK.getMsg(), object);
}
/**
* 失败返回
*
* @param apiCode 错误码
* @return 自定义的 ApiResponse 对象
*/
public static ApiResponse<Object> fail(ApiCode apiCode) {
return new ApiResponse<>(apiCode.code(), apiCode.getMsg(), "");
}
}
使用返回类
我们修改一下 Controller 里面的接口返回,现在不是直接返回实体类了,而是封装成我们的返回类,再返回给调用方:
@GetMapping("/user/{username}")
public ApiResponse<User> findUserByUsername(@PathVariable(name = "username") String username) {
return ApiResponse.success(userService.findByUsername(username));
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。