RestFul API 统一格式返回 + 全局异常处理

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

返回错误信息

message: “”,

}

复制代码

2.2 结果类枚举

public enum ResultCodeEnum {

/*** 通用部分 100 - 599***/

// 成功请求

SUCCESS(200, “successful”),

// 重定向

REDIRECT(301, “redirect”),

// 资源未找到

NOT_FOUND(404, “not found”),

// 服务器错误

SERVER_ERROR(500,“server error”),

/*** 这里可以根据不同模块用不同的区级分开错误码,例如: ***/

// 1000~1999 区间表示用户模块错误

// 2000~2999 区间表示订单模块错误

// 3000~3999 区间表示商品模块错误

// 。。。

;

/**

  • 响应状态码

*/

private Integer code;

/**

  • 响应信息

*/

private String message;

ResultCodeEnum(Integer code, String msg) {

this.code = code;

this.message = msg;

}

public Integer getCode() {

return code;

}

public String getMessage() {

return message;

}

}

复制代码

  • code:响应状态码

一般小伙伴们是在开发的时候需要什么,就添加什么。但是,为了规范,我们应当参考HTTP请求返回的状态码。

|   | code区间 | 类型 | 含义 |

| — | — | — | — |

| 1** | 100-199 | 信息 | 服务器接收到请求,需要请求者继续执行操作 |

| 2** | 200-299 | 成功 | 请求被成功接收并处理 |

| 3** | 300-399 | 重定向 | 需要进一步的操作以完成请求 |

| 4** | 400-499 | 客户端错误 | 请求包含语法错误或无法完成请求 |

| 5** | 500-599 | 服务器错误 | 服务器在处理的时候发生错误 |

常见的HTTP状态码:

  1. 200 - 请求成功;

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

  3. 404 - 请求的资源(网页等)不存在;

  4. 500 - 内部服务器错误。

  • message:错误信息

在发生错误时,如何友好的进行提示?

  1. 根据code 给予对应的错误码定位;

  2. 把错误描述记录到message中,便于接口调用者更详细的了解错误。

2.3 统一结果类

public class HttpResult implements Serializable {

/**

  • 是否响应成功

*/

private Boolean success;

/**

  • 响应状态码

*/

private Integer code;

/**

  • 响应数据

*/

private T data;

/**

  • 错误信息

*/

private String message;

// 构造器开始

/**

  • 无参构造器(构造器私有,外部不可以直接创建)

*/

private HttpResult() {

this.code = 200;

this.success = true;

}

/**

  • 有参构造器

  • @param obj

*/

private HttpResult(T obj) {

this.code = 200;

this.data = obj;

this.success = true;

}

/**

  • 有参构造器

  • @param resultCode

*/

private HttpResult(ResultCodeEnum resultCode) {

this.success = false;

this.code = resultCode.getCode();

this.message = resultCode.getMessage();

}

// 构造器结束

/**

  • 通用返回成功(没有返回结果)

  • @param

  • @return

*/

public static HttpResult success(){

return new HttpResult();

}

/**

  • 返回成功(有返回结果)

  • @param data

  • @param

  • @return

*/

public static HttpResult success(T data){

return new HttpResult(data);

}

/**

  • 通用返回失败

  • @param resultCode

  • @param

  • @return

*/

public static HttpResult failure(ResultCodeEnum resultCode){

return new HttpResult(resultCode);

}

public Boolean getSuccess() {

return success;

}

public void setSuccess(Boolean success) {

this.success = success;

}

public Integer getCode() {

return code;

}

public void setCode(Integer code) {

this.code = code;

}

public T getData() {

return data;

}

public void setData(T data) {

this.data = data;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

@Override

public String toString() {

return “HttpResult{” +

“success=” + success +

“, code=” + code +

“, data=” + data +

“, message='” + message + ‘’’ +

‘}’;

}

}

复制代码

说明:

  1. 构造器私有,外部不可以直接创建;

  2. 只可以调用统一返回类的静态方法返回对象;

  3. success 是一个Boolean 值,通过这个值,可以直接观察到该次请求是否成功;

  4. data 表示响应数据,用于请求成功后,返回客户端需要的数据。

三、测试及总结


3.1 简单的接口测试

@RestController

@RequestMapping(“/httpRest”)

@Api(tags = “统一结果测试”)

public class HttpRestController {

@ApiOperation(value = “通用返回成功(没有返回结果)”, httpMethod = “GET”)

@GetMapping(“/success”)

public HttpResult success(){

return HttpResult.success();

}

@ApiOperation(value = “返回成功(有返回结果)”, httpMethod = “GET”)

@GetMapping(“/successWithData”)

public HttpResult successWithData(){

return HttpResult.success(“风尘博客”);

}

@ApiOperation(value = “通用返回失败”, httpMethod = “GET”)

@GetMapping(“/failure”)

public HttpResult failure(){

return HttpResult.failure(ResultCodeEnum.NOT_FOUND);

}

}

复制代码

这里 Swagger以及SpringMVC的配置就没贴出来了,详见Github 示例代码。

3.2 返回结果

http://localhost:8080/swagger-ui.html#/

{

“code”: 200,

“success”: true

}

复制代码

{

“code”: 200,

“data”: “风尘博客”,

“success”: true

}

复制代码

{

“code”: 404,

“message”: “not found”,

“success”: false

}

复制代码

四、全局异常处理


使用统一返回结果时,还有一种情况,就是程序的报错是由于运行时异常导致的结果,有些异常是我们在业务中抛出的,有些是无法提前预知。

因此,我们需要定义一个统一的全局异常,在Controller捕获所有异常,并且做适当处理,并作为一种结果返回。

4.1 设计思路:

  1. 自定一个异常类(如:TokenVerificationException),捕获针对项目或业务的异常;

  2. 使用@ExceptionHandler注解捕获自定义异常和通用异常;

  3. 使用@ControllerAdvice集成@ExceptionHandler的方法到一个类中;

  4. 异常的对象信息补充到统一结果枚举中;

4.2 自定义异常

public class TokenVerificationException extends RuntimeException {

/**

  • 错误码

*/

protected Integer code;

protected String msg;

public Integer getCode() {

return code;

}

public String getMsg() {

return msg;

}

public void setMsg(String msg) {

this.msg = msg;

}

/**

  • 有参构造器,返回码在枚举类中,这里可以指定错误信息

  • @param msg

*/

public TokenVerificationException(String msg) {

super(msg);

}

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-W5TQDPBS-1714742789925)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值