【Java学习】API接口数据规范

在日常开发中,一个优雅的API,必须提供简单明了的响应值,然后根据状态码就可以大概知道问题的所在。这里主要整理一下HTTP状态码和自定义状态码。

1、HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。

常见的HTTP状态码有:

200-请求成功。

301-资源(网页等)被永久转移到其它URL。

403-服务器拒绝访问。验证身份通过了,但是资源没有权限进行操作。

404-请求资源(网页等)不存在。

500-内部服务器错误。

504-网关超时。服务器作为网关或代理,但是没有及时从上游服务器收到请求。

2、HTTP状态码分类

HTTP状态码可以分为5类:消息响应、成功响应、重定向、客户端错误、服务器错误。

状态

描述

100

继续。客户端应继续其请求

101

切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议。

200

请求成功。一般用于GET与POST请求。

201

已创建。成功请求并创建了新的资源。

202

已接受。已经接受请求,但未处理完成。

203

非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本。

204

无内容。服务器成功处理,但未返回内容。

205

重置内容。

300

多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择。

301

永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替。

302

临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI。

303

查看其它地址。与301类似。使用GET和POST请求查看。

304

未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。

305

使用代理。所请求的资源必须通过代理访问。

400

客户端请求的语法错误,服务器无法理解。

401

用户身份认证失败。

402

保留,将来使用。

403

验证身份通过了,但是资源没有权限进行操作。

404

服务器无法根据客户端的请求找到资源(网页)。

405

客户端请求中的方法被禁止。

500

服务器内部错误,无法完成请求。

501

服务器不支持请求的功能,无法完成请求。

502

作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

503

由于超载或系统维护,服务器暂时的无法处理客户端的请求。

504

服务器作为网关或代理,但是没有及时从上游服务器收到请求。

3、自定义响应状态码规范

后端返回给前端一般使用json格式,定义如下:

{
    #返回状态码
    Code:integer,
    #返回信息描述
    message:string,
    #返回值
    data:object
}

3.1、返回接口

public interface IResultStatus {
    /**
     * 状态码
     * @return
     */
    Integer errorCode();
    /**
     * 异常信息
     * @return
     */
    String errorMsg();
}

3.2、状态码枚举:

public enum ResultStatus implements IResultStatus {
    /**
     * 状态码及对应信息
     */
    //成功状态码
    SUCCESS(0, "执行成功"),
    //参数错误:1001~1999
    PARAM_IS_INVALID(1001, "参数无效"),
    PARAM_IS_BLANK(1002, "参数为空"),
    PARAM_TYPE_BIND_ERROR(1003, "参数类型错误"),
    //用户错误:2001~2999
    USER_LOGIN_ERROR(2001, "账号不存在或密码错误"),
    USER_ACCOUNT_FORBIDDEN(2002, "账户已被禁用"),
    USER_NOT_EXIST(2003, "用户不存在");
    private int errorCode;
    private String errorMsg;
    ResultStatus(int errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }
    @Override
    public Integer errorCode() {
        return errorCode;
    }
    @Override
    public String errorMsg() {
        return errorMsg;
    }
}

状态码和信息就会一一对应,比较好维护。这样前端同事在得到返回值后,根据状态码就可以知道,大概是什么错误,再根据message相关的信息描述,可以快速定位。

3.3、返回数据体

json格式,根据不同的业务有不同的json体,可以设计一个返回体类Result

@Data
public class Result {
    private Integer code;
    private String message;
    private Object data;
    public Result(ResultStatus restStatus, Object data) {
        this.code = restStatus.errorCode();
        this.message = restStatus.errorMsg();
        this.data = data;
    }
    /**
     * 业务成功返回业务代码和描述信息
     */
    public static Result success() {
        return new Result(ResultStatus.SUCCESS, null);
    }
    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static  Result success(T data) {
        return new Result(ResultStatus.SUCCESS, data);
    }
    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static  Result success(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return success(data);
        }
        return new Result(resultStatus, data);
    }
    /**
     * 业务异常返回业务代码和描述信息
     */
    public static  Result failure() {
        return new Result(ResultStatus.PARAM_TYPE_BIND_ERROR, null);
    }
    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static  Result failure(ResultStatus resultStatus) {
        return failure(resultStatus, null);
    }
    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static  Result failure(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return new Result(ResultStatus.PARAM_IS_INVALID, null);
        }
        return new Result(resultStatus, data);
    }
}

3.4、返回体测试

@RestController
@RequestMapping("/api/demo2")
public class Demo2Controller {
    private static final HashMap INFO;
    static {
        INFO = new HashMap<>();
        INFO.put("name", "张三");
        INFO.put("age", "25");
    }
    @GetMapping("/getInfo")
    public Map getInfo() {
        return INFO;
    }
    @GetMapping("/getInfoResult")
    public Result> getInfoResult() {
        return Result.success(INFO);
    }
}

结果参考:

【Java学习】API接口数据规范

【Java学习】API接口数据规范

Original: https://www.cnblogs.com/pbinlog/p/16130383.html
Author: pbinlog
Title: 【Java学习】API接口数据规范

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571326/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式 《head first 设计模式》

    策略设计模式:strategy pattern 定义了算法族,分别封装起来,让他们之间可以互相替换。 此模式让算法的变化独立于算法的客户类 客户类,以 接口定义的 实例变量作其域,…

    Java 2023年6月9日
    0183
  • poi导出excel的一个合并单元格的方法

    1、最近在做一个导出excel的需求,过程中整合了一个合并列相同单元格的方法 /** * 合并列单元&#x68…

    Java 2023年6月7日
    092
  • 二叉树的遍历(非递归)

    二叉树的遍历(非递归) 本文分为以下部分: 前期准备 先序遍历 中序遍历 *后序遍历 上次文章中写的是递归版的二叉树遍历,这次采用非递归模式遍历二叉树。 前期准备 建立一个节点类,…

    Java 2023年6月5日
    087
  • MySQL 千万数据库深分页查询优化,拒绝线上故障!

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 优化项目代码过程中发现一个千万级数据深分页问题,缘由是这样的 库里有一张耗材 MCS_P…

    Java 2023年6月14日
    0101
  • for、foreach、stream 哪家的效率更高,你真的用对了吗?

    昨天在《SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?》一文中,有同学指出Stream在数据量不庞大的情况,效率不如for循环。 这个就触及到我的知…

    Java 2023年5月29日
    0119
  • == 和 equals 的区别是什么?

    ==:基本类型比较的是值的大小,引用类型比较的是内存地址,是不是同一个对象,equals:默认比较同一个对象的内容 == 和 equals 的区别是什么? == : 它的作用是判断…

    Java 2023年6月13日
    077
  • HTTP缺点有哪些,如何解决

    前言 大家好,我是蜗牛,在上一篇中,我们介绍了不同版本的HTTP区别和发展背景,这篇文章我们来聊聊HTTP的缺点,HTTP缺点大致总结有以下三点: 通信使用明文(不加密),内容可能…

    Java 2023年6月15日
    0107
  • 地址解析协议(ARP) 分析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    065
  • 关于系统权限的设计-位操作

    本文讨论是权限设计的其中一种思路,有它自己的优缺点,不一定适用于所有系统。 一、Linux文件权限 大家都知道,Linux上有三种文件权限: r:表示读取,对应的数字为 4; w:…

    Java 2023年6月9日
    098
  • 动手制作 java版本切换 多版本JDK安装 windows JDK版本 切换

    1、下载各版本安装包,指定安装位置顺序安装 2、删除注册表,文件和环境变量 文件: C:\Windows\System32 下java相关文件如 java.exe javaw.ex…

    Java 2023年5月29日
    055
  • 性能调优——小小的log大大的坑

    引言 “只有被线上服务问题毒打过的人才明白日志有多重要!”我先说结论,谁赞成,谁反对?如果你深有同感,那恭喜你是个社会人了:) 日志对程序的重要性不言而喻,…

    Java 2023年6月15日
    0109
  • Java 锁 并发 线程同步 学习笔记 2022-3-31

    Java中的锁 java中的锁主要用于 保障线程在多并发情况下数据的一致性,即多次执行过程中,线程的执行顺序都不相同,但最终的结果始终相同。 通常在使用对象或者调用方法之前 加锁,…

    Java 2023年6月5日
    0102
  • SpringBoot整合Filter过滤器

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    079
  • Redis缓存更新策略

    Redis缓存更新策略 本文整理自黑马程序员相关资料 内存淘汰 超时剔除 主动更新 说明 不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓…

    Java 2023年6月8日
    0134
  • SkyWalking分布式系统应用程序性能监控工具-中

    其他功能 性能剖析 在系统性能监控方法上,Skywalking 提出了代码级性能剖析这种在线诊断方法。这种方法基于一个高级语言编程模型共性,即使再复杂的系统,再复杂的业务逻辑,都是…

    Java 2023年6月5日
    0111
  • Postman 正确使用姿势

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的…

    Java 2023年6月5日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球