目前咱们的返回是间接把实体类扔给申请方,这样很不敌对,一方面没有对立的格局,二来申请方不晓得申请胜利与否,没有一个能够判断的货色,也没有说明性的返回。

本篇就来为所有接口提供一个对立的敌对返回。

确定返回构造

首先,咱们先确定好咱们接口返回的格局是什么样的,而后再一步一步实现上面的。

{    "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));}