Java 前后端 统一返回数据格式

目录

  • 1 概述
  • 2 状态码定义
  • 3 统一返回数据结构

1 概述

现在前后端交互,基本上都有统一的返回数据结构,因此我特地总结了相关知识,形成这篇博客。

2 状态码定义


/**
 * description: 基本返回状态码
 */
public enum RespBasicCode {
    /**
     * 4xx 客户端异常 5xx服务器异常
     */

    SUCCESS("200", "成功"),
    PARAMETER_ERROR("400", "参数异常"),
    BAD_REQUEST("400", "无效的请求"),
    ERROR("500", "异常错误"),

    /*--------根据业务实际情况,可以自己定义返回的状态码-------*/
    ;

    /**
     * 返回状态码
     */
    private String code;

    /**
     * 返回描述
     */
    private String result;

    RespBasicCode(String code, String result) {
        this.code = code;
        this.result = result;
    }

    public String getCode() {
        return code;
    }

    public String getResult() {
        return result;
    }

    /**
     * 通过code 获取RespBasicCode对象
     *
     * @param code 状态码
     * @return RespBasicCode对象
     */
    public static RespBasicCode getRespBasicCodeByCode(String code) {
        if (code == null || "".equals(code)) {
            return null;
        }
        for (RespBasicCode respBasicCode : RespBasicCode.values()) {
            if (respBasicCode.getCode().equals(code)) {
                return respBasicCode;
            }
        }
        return null;
    }

    /**
     * 通过code 获取resultDes
     *
     * @param code 状态码
     * @return resultDes
     */
    public static String getResultDesByCode(String code) {
        if (code == null || "".equals(code)) {
            return null;
        }
        for (RespBasicCode respBasicCode : RespBasicCode.values()) {
            if (respBasicCode.getCode().equals(code)) {
                return respBasicCode.getResult();
            }
        }
        return null;
    }
}

3 统一返回数据结构


/**
 * description: 服务之间交互统一响应
 * 返回划分为2部分:分别是头部和实体信息
 * 头部返回状态为200,则从Body里面取数据
 * 如果头部返回异常状态码,则从头部取出错误信息
 */
public class ActionResponse<T> {

    /**
     * 返回的头部信息
     */
    private Head head = new Head();

    /**
     * 返回主体信息
     */
    private Body body = new Body();

    /**
     * 返回成功,没有data数据 结果:
     * {
     *     "head": {
     *         "code": "200",
     *         "result": "成功"
     *     },
     *     "body": null
     * }
     *
     * @param <T> Body中 data类型
     * @return ActionResponse
     */

    public static <T> ActionResponse<T> success() {
        return new ActionResponse<T>(RespBasicCode.SUCCESS.getCode(),RespBasicCode.SUCCESS.getResult(),null);
    }

    /**
     * 返回成功,并且带有数据 结果:
     * {
     *     "head": {
     *         "code": "200",
     *         "result": "成功"
     *     },
     *     "body": [
     *         "你好 宇宙"
     *     ]
     * }
     *
     * @param data 数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> success(T data) {
        return new ActionResponse<>(RespBasicCode.SUCCESS.getCode(),RespBasicCode.SUCCESS.getResult(), data);
    }

    /**
     * 返回失败,自定义状态码,并且没有任何数据 结果:
     *{
     *     "head": {
     *         "code": "400",
     *         "result": "参数异常"
     *     },
     *     "body": null
     * }
     *
     * @param respCode 状态码对象
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> fail(RespBasicCode respCode) {
        return new ActionResponse<>(respCode.getCode(),respCode.getResult(),null);
    }

    /**
     * 返回失败,自定义状态码,并且封装数据 结果:
     *{
     *     "head": {
     *         "code": "400",
     *         "result": "参数异常"
     *     },
     *     "body": [
     *         "你好 宇宙"
     *     ]
     * }
     *
     * @param respCode respCode 状态码对象
     * @param data 数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> fail(RespBasicCode respCode, T data) {
        return new ActionResponse<>(respCode.getCode(), respCode.getResult(), data);
    }

    /**
     * 自定义返回信息
     *
     * @param code head中的code
     * @param result head中的result
     * @param data body中的数据
     * @param <T> Body中 data类型
     * @return ActionResponse
     */
    public static <T> ActionResponse<T> custom(String code,String result, T data){
        return new ActionResponse<>(code,result,data);
    }

    /**
     * 真正的数据源泉,所有方法均是调用这个构造器
     *
     * @param code head中的具体的状态码
     * @param result head中的描述信息
     */
    private ActionResponse(String code, String result, T data) {
        this.head.code = code;
        this.head.result = result;
        this.body.data = data;
    }

    public Head getHead() {
        return head;
    }

    public T getBody() {
        return body.getData();
    }

    /**
     * 返回的实体信息
     */
    private class Body {
        /**
         * 数据域,如果是分页直接为PageResult即可
         */
        private T data;

        public T getData() {
            return data;
        }
    }

    /**
     * 响应的头部
     */
    private class Head {
        /**
         * 状态码
         */
        private String code;

        /**
         * 结果描述
         */
        private String result;

        public String getCode() {
            return code;
        }

        public String getResult() {
            return result;
        }

    }
}

原文地址:https://www.cnblogs.com/AdaiCoffee/p/11286098.html

时间: 2024-07-29 08:34:15

Java 前后端 统一返回数据格式的相关文章

【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?

原文:http://blog.csdn.net/piantoutongyang/article/details/50878214 今天看到两篇文章,讲解 为什么web开发启用jsp,确实挺有道理,整理如下: 使用jsp的痛点: 1.jsp上动态资源和静态资源全部耦合在一起,服务器压力大,因为服务器会收到各种静态资源的http请求,动态代码的等等,除非你使用nginx. 万一你的java代码出现了bug,你的页面是显示不出来的,直接蹦到了5xx页面,用户体验极差. (现在javaWeb项目业界的标

Java前后端分离的认识

1.原由 在网上查了关于前后端分离的资料,有所粗浅认识.记录下来,方便以后使用.以下均是个人看法,仅做参考.如有错误请指教,共同进步. 2.为什么前后端分离? ①.一个后台,可以让多种前台系统使用.后台仅仅对外提供接口,前台遵从接口标准向此接口发送合法的数据来获取对应的数据.例如,一个后台系统,你可以在web端.app.小程序.等多种前端来访问后台对应的接口. 3.分离后的前后台开发人员的工作内容变化 ①.前台开发者不在仅仅简单的提供页面,还要负责调转的任务(以前靠springmvc.strut

java前后端开发需掌握的框架及技术

一.Java开发 1.J2EE架构及主流框架,spring4.spring boot.spring MVC.spring Security.spring cloud.struct2.hibernate5.mybatis3.maven.shiro等.2.前端:HTML5.Javascript.css.JQuery.bootstrap等.3.关系型数据库:MySQL.Oracle等设计.使用.优化等,熟悉分库分表.NoSQl数据库:redis.MongoDB等,熟悉MongoDB分片等.4.MQ产品

java 前后端跨域问题解决

前端页面部署在nginx 上 ,后端代码部署在服务器上 ,前端访问后台会出现跨域问题 新建一个过滤器 /** * 开放跨域权限 * * */@Slf4jpublic class testFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest var1, ServletResponse

Java前后端依赖

有时候我们的一个类需要依赖另外一个类,这种就是依赖关系,创建对象的工作一般由spring容器来完成然后注入给调用者,这种就是依赖注入. 代码可参考1227210565朋友空间 DispatcherServlet是前置控制器,配置在web.xml文件中的.拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理.  所以我们现在web.xml中加入以下配置: .静态资源不拦截 如果只配置拦截类似于*.do格式的url,则对静态资源的访

前后端分离之——接口数据返回---标准格式

开发中,如果前端和后端,在没有统一返回数据格式,我们来看一下会发生什么: 后台开发人员A,在接口返回时,习惯返回一个返回码code=0000,然后返回数据: 后台开发人员B,在接口返回时,习惯直接返回一个boolean类型的success=true,然后返回数据: 后台开发人员C,在接口返回时,习惯在接口失败时返回码为code=0000. 可以看到,上面的三个开发人员,都没有大问题,没有谁对谁错,只要给前端接口文档,前端都是可以接上接口的.但是,在项目功能越来越多,接口数量持续增长时,对开发人员

UEditor之基于Java图片上传前后端源码研究

开心一笑 一定要快乐学习,所以学习之前先看个笑话: 刚来北京,租了一个小房,一楼,上淘宝买衣服,选了付钱了联系卖家:"我已付款,请发货."谁知那货直接说:"我看到你地址了,自己上楼来拿吧!我就在你楼上." 拿你妹,老子付了邮费的...送下来. 提出问题 Ueditor前后端源码的学习和简单的研究??? 解决问题 前提: 假如你已经看了我的前一篇文章,这一点很重要的啊,当然不看也可以,因为你已经是一个高手,就像我一样,哈哈: 假如你已经安装tomcat服务器: 假如你

一个Java程序猿眼中的前后端分离以及Vue.js入门

松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的,把 Vue.js 官网的资料从头到尾浏览一遍该懂的基本就懂了,个人感觉这个是最好的 Vue.js 学习资料 ,因此在我的书里边就没有多说.但是最近总结小伙伴遇到的问题,感觉很多人对前后端分离开发还是两眼一抹黑,所以今天松哥想和大家聊一下前后端分离以及 Vue.js 的一点事,算是一个简单的入门科普吧. 前后端不分 后端模板:Jsp.FreeMarker.Velocity 前端模板:Thymeleaf 前

前后端分离异常统一处理

作为一个程序员,虽然技术不厉害,但是都有一个向上的心,原来一直负责业务开发,梳理业务.设计流程.开发代码,最近开始接触一些架构类的设计和思路 全国医改在即,项目组接了一个医疗改革相关的供应商项目,主要是针对物流方向的. 技术架构:领导要求用springcloud但是新来的成员都没有相关开发经验,项目负责人直接在网上扒了一套微服务的代码(个人感觉不太成熟),好多东西不太全, 所以需要重新整理,由于项目负责人比较忙,自己有迫切的想要了解一些东西,所以针对架构层次的代码学习了一下, 自己原来只做业务,