Springboot2.x 实现前后分离的固定响应结构 {code,data,msg} 代码及想法

想法

之前也封装过多次响应结构,但是总是感觉越封越不好用,还有时候把http状态码忽略掉,直接响应自定义的结构,后面发现自定义响应结构不能应付需要http状态码的场景。

本次实现没有把系统提供的 ResponseEntity 封装进去,只是实现了自定义响应数据结构,感觉还不错。

我现在自己使用的只有自定义 code (0,1),如果还需要其他的,可以自行添加。

代码

封装的泛型响应结构类 HttpResponseStructure

package com.xiaqiuchu.im.api.util;

import com.xiaqiuchu.im.api.type.HttpResponseStructureCodeEnum;

import java.io.Serializable;

/**
 * @Author 夏秋初
 * @Date 2022/3/14 13:21
 */
public class HttpResponseStructureUtil<T> implements Serializable {

    private HttpResponseStructureCodeEnum code;
    private String msg = "";
    private T data = null;

    public static<T> HttpResponseStructureUtil<T> getInterface(){
        return new HttpResponseStructureUtil<T>();
    }

    public HttpResponseStructureUtil<T> setCode(HttpResponseStructureCodeEnum code) {
        this.code = code;
        return this;
    }

    public HttpResponseStructureUtil<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    public HttpResponseStructureUtil<T> setData(T data) {
        this.data = data;
        return this;
    }

    public Integer getCode() {
        return code.getCode();
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

    public static<T> HttpResponseStructureUtil success(HttpResponseStructureCodeEnum code, String msg, T data) {
        return HttpResponseStructureUtil.getInterface().setCode(code).setMsg(msg).setData(data);
    }
    public static<T> HttpResponseStructureUtil success(HttpResponseStructureCodeEnum code, T data) {
        return HttpResponseStructureUtil.getInterface().setCode(code).setMsg("操作成功").setData(data);
    }
    public static HttpResponseStructureUtil success(HttpResponseStructureCodeEnum code) {
        return HttpResponseStructureUtil.getInterface().setCode(code).setMsg("操作成功").setData(null);
    }
    public static<T> HttpResponseStructureUtil success(T data) {
        return HttpResponseStructureUtil.getInterface().setCode(HttpResponseStructureCodeEnum.SUCCESS).setMsg("操作成功").setData(data);
    }
    public static HttpResponseStructureUtil success() {
        return HttpResponseStructureUtil.getInterface().setCode(HttpResponseStructureCodeEnum.SUCCESS).setMsg("操作成功").setData(null);
    }

    public static HttpResponseStructureUtil error(HttpResponseStructureCodeEnum code, String msg) {
        return HttpResponseStructureUtil.getInterface().setCode(code).setMsg(msg);
    }
    public static HttpResponseStructureUtil error(HttpResponseStructureCodeEnum code) {
        return HttpResponseStructureUtil.getInterface().setCode(code).setMsg("操作失败");
    }
    public static HttpResponseStructureUtil error() {
        return HttpResponseStructureUtil.getInterface().setCode(HttpResponseStructureCodeEnum.ERROR).setMsg("操作失败");
    }


}

响应Code枚举类

package com.xiaqiuchu.im.api.type;

/**
 * 响应Code枚举类
 * @Author 夏秋初
 * @Date 2022/3/14 13:41
 */
public enum HttpResponseStructureCodeEnum {
    // 成功
    SUCCESS(0),
    // 失败
    ERROR(1);

    private Integer code;

    HttpResponseStructureCodeEnum(Integer code){
        this.code = code;
    }

    public Integer getCode(){
        return code;
    }
}

当前接口 dto 响应

package com.xiaqiuchu.im.api.entity.res.websocket;

import lombok.Data;

import java.util.HashMap;

/**
 * @Author 夏秋初
 * @Date 2022/3/21 16:24
 */
@Data
public class ResWebsocketMessageTypeAll {
    private HashMap<String,String> types;
}

使用

代码调用

package com.xiaqiuchu.im.api.controller.websocket;

import com.xiaqiuchu.im.api.entity.res.websocket.ResWebsocketMessageTypeAll;
import com.xiaqiuchu.im.api.service.websocket.WebsocketMessageTypeService;
import com.xiaqiuchu.im.api.util.HttpResponseStructureUtil;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;

/**
 * @Author 夏秋初
 * @Date 2022/3/13 16:49
 */
@RequestMapping("/websocket/messagetype")
@RestController
public class WebsocketMessageType {

    @Resource
    WebsocketMessageTypeService websocketMessageTypeService;

    @GetMapping("/all")
    public ResponseEntity<HttpResponseStructureUtil<ResWebsocketMessageTypeAll>> getAllType(){
        ResWebsocketMessageTypeAll resWebsocketMessageTypeAll = new ResWebsocketMessageTypeAll();
        resWebsocketMessageTypeAll.setTypes(websocketMessageTypeService.getAllType());
        return new ResponseEntity<>(HttpResponseStructureUtil.success(resWebsocketMessageTypeAll), HttpStatus.OK);
    }
}

结果

image
image

posted @   夏秋初  阅读(468)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2019-03-14 Centos7 忘记密码的情况下,修改root或其他用户密码
2019-03-14 【网络安全】telnet 登陆远程服务器
点击右上角即可分享
微信分享提示