Spring Boot API 统一返回格式封装
今天给大家带来的是Spring Boot API 统一返回格式封装,我们在做项目的时候API 接口返回是需要统一格式的,只有这样前端的同学才可对接口返回的数据做统一处理,也可以使前后端分离
模式的开发中,只关注于业务,而无需考虑对每一个返回结果做处理,中心思想是,所有结果封装为json,错误信息通过异常抛出,统一捕捉处理后返回前端,举例:如果插入一条用户信息,而
这个用户已经在系统中存在,则返回插入失败,我们用枚举定义一个返回信息,通过异常抛出。
源码地址https://gitee.com/zgc005/resut
废话少说 上代码
先讲项目结构
├── LICENSE
├── demo.iml
├── pom.xml
├── re
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── result
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── common
│ │ │ └── config
│ │ ├── global
│ │ │ ├── advice
│ │ │ │ ├── ExceptionResultAdvice.java ———— 异常捕捉。处理。
│ │ │ │ └── ResponseResultAdvice.java ———— 接口返回统一封装
│ │ │ ├── annotation
│ │ │ │ └── ResponseResult.java ———— 自定义标签 用来验证接口是否需要包装返回 并且验证接口是否存在
│ │ │ ├── config
│ │ │ │ └── GlobalConfig.java ———— 全局配置,读取*.yml 配置文件信息
│ │ │ ├── enums
│ │ │ │ └── ResultCode.java ———— api异常枚举
│ │ │ ├── exception
│ │ │ │ └── BizException.java
│ │ │ ├── filterLists
│ │ │ │ ├── FilterConfig.java ———— Filter 配置
│ │ │ │ └── SignAuthFilter.java ———— 接口请求验签等操作
│ │ │ ├── interceptor
│ │ │ │ ├── ResponseResultInterceptor.java 用来处理返回数据是否需要封装
│ │ │ │ └── WebConfigurer.java
│ │ │ ├── result
│ │ │ │ ├── EnumInterface.java
│ │ │ │ └── Result.java
│ │ │ └── sign
│ │ │ ├── BodyReaderHttpServletRequestWrapper.java ————对请求流处理
│ │ │ ├── HttpUtils.java
│ │ │ └── SignUtil.java
│ │ ├── modules
│ │ │ ├── goods
│ │ │ │ ├── controller
│ │ │ │ │ └── GoodsController.java
│ │ │ │ ├── dao
│ │ │ │ │ └── GoodsDao.java
│ │ │ │ ├── entity
│ │ │ │ │ ├── Goods.java
│ │ │ │ │ ├── GoodsBrandBean.java
│ │ │ │ │ ├── GoodsImage.java
│ │ │ │ │ ├── ProductEntity.java
│ │ │ │ │ └── TestName.java
│ │ │ │ └── service
│ │ │ │ ├── GoodsService.java
│ │ │ │ └── impl
│ │ │ │ └── GoodsServiceImpl.java
│ │ │ ├── order
│ │ │ │ ├── controller
│ │ │ │ ├── dao
│ │ │ │ ├── entity
│ │ │ │ └── service
│ │ │ ├── user
│ │ │ │ ├── controller
│ │ │ │ ├── dao
│ │ │ │ ├── entity
│ │ │ │ └── service
│ │ │ └── util
│ │ │ └── JsonTOpagaData.java
│ │ ├── scheduled
│ │ │ ├── ScheduledMachine.java
│ │ │ └── ScheduledProduct.java
│ │ └── test
│ │ ├── Demo.java
│ │ └── Test.java
│ └── resources
│ ├── application-dev.yml
│ ├── application-pro.yml
│ ├── application-test.yml
│ ├── application.yml
│ └── mapper
│ ├── goods
│ │ └── GoodsDao.xml
│ ├── machine
│ │ └── MachineDao.xml
│ ├── order
│ └── user
└── test
└── java
└── com
└── result
└── demo
└── DemoApplicationTests.java
以下是几个核心的类
- ExceptionResultAdvice :所有的异常都会通个这个类进行捕捉,处理,如果有新增加的Exception 只需要新增方法即可,如新增一个XXXException的方法
@ExceptionHandler(value = XXXException.class)
public Result XXXexceptionHandler(XXXException xxxexception){
log.info("系统异常处理:{}",xxxexception);
return Result.error();
}
- ResponseResultAdvice: 重写返回数据,这个类主要是对返回结果进行封装,而不需要在每一个Controller 里的方法进行封装,简化代码,做到只关注业务。
这里有一个坑:ResponseBodyAdvice 返回类型如果是String 的话会报错,原因大家可以自行查看,所以这个地方要对String 类型的数据进行处理
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
log.info("进入返回提重写格式 处理中。。。。。。");
Result result = new Result();
// 包含Result 说明是异常
if (body instanceof Result) {
return body;
}
if (body instanceof String) {
String str = JSON.toJSONString(Result.success(body));
return str;
}
return Result.success(body);
}
- ResponseResult: 这个是自定义的标签,主要是用来判断Controller 类的返回数据是否需要封装用法如下
@Slf4j
@RestController
@RequestMapping(value = "/api")
@ResponseResult
public class Test {
}
在ResponseResultInterceptor 类里会对这个标签进行判断处理。
public class ResponseResultInterceptor implements HandlerInterceptor {
public static final String RESPONSE_RESULT_ANN = "RESPONSE-RESULT-ANN";
/**
* 此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。
*
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 方法校验
if (handler instanceof HandlerMethod) {
final HandlerMethod handlerMethod = (HandlerMethod) handler;
final Class<?> clazz = handlerMethod.getBeanType();
final Method method = handlerMethod.getMethod();
if (clazz.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, clazz.getAnnotation(ResponseResult.class));
} else if (method.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, method.getAnnotation(ResponseResult.class));
}
return true;
} else {
return initResponse(response, ResultCode.API_NOT_EXIST);
}
}
private boolean initResponse(HttpServletResponse response,ResultCode resultCode) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", resultCode.getCode());
jsonObject.put("message", resultCode.getMessage());
jsonObject.put("data", null);
writer.write(jsonObject.toString());
return false;
}
小结:对于面向对象编程的逻辑思维要始终贯穿于整个项目,对象的封装也是必然,一个类是对象,多个类组成的模块也是对象,甚至在庞大的系统中,每一个子系统都是一个对象,这也就是OOP的核心 ,一切皆对象,所以没有对象的同学要抓紧时间找个对象,只有这样你才会知道如何面向对象!!!
Spring Boot API 统一返回格式封装的更多相关文章
- [Web API] 如何让 Web API 统一回传格式以及例外处理[转]
[Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...
- [Web API] 如何让 Web API 统一回传格式以及例外处理
[Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...
- ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)
现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...
- spring boot 规范json返回值
spring boot 规范json返回值 spring boot 接口返回配置 @ResponseBody ,则返回自定义的对象,解析成json. 但是,部分字段能友好的展示出来.如 Date,Lo ...
- spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type
问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...
- 基于Spring Boot的统一异常处理设计
基于Spring Boot的统一异常处理设计 作者: Grey 原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html Spring Boot中,支 ...
- Spring Boot将Mybatis返回结果转为驼峰的三种实现方式
本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:Spring Boot将Mybatis返回结果转为驼峰的三种实现方式: 我们通常获取Mybatis返回的数据结果时想要将字段以驼峰的形式返回 ...
- 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常
## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...
- spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)
一,为什么要使用REST? 1,什么是REST? REST是软件架构的规范体系,它把资源的状态用URL进行资源定位, 以HTTP动作(GET/POST/DELETE/PUT)描述操作 2,REST的优 ...
随机推荐
- 搭建zabbix+grafana监控
编写一件安装脚本 #!/bin/sh echo "\033[32;1m脚本作者:fage\033[0m" #sleep 10 zabbix_version=4.0.2 zabbix ...
- Python数据类型--元组(tuple)
元组与列表非常相似,最大区别在于: (1)元组是不可修改的,定义之后就"固定"了. (2)元组在形式上是用()这样的圆括号括起来 (3)元组不能插入或删除元素 注:元素可修改与不可 ...
- Flask之WTF
Flask-WTF是什么? 是一个关于表单的扩展库,可以自动生成表单的HTML代码和验证提交的表单数据,并且提供跨站请求伪造(Cross-Site Request Forgery)保护的功能,使用非常 ...
- 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!
对于维护.管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务.所以,今天民工哥给大家安利一款 Linu ...
- property和setter装饰器
# property装饰器 # 作用: 将一个get方法转换为对象的属性. 就是 调用方法改为调用对象 # 使用条件: 必须和属性名一样 # setter方法的装饰器: # 作用:将一个set方法转换 ...
- windows搭建SVN服务MD版
windows搭建SVN服务MD 1下载TortoiseSVN 官网下载 根据自己系统环境选择适合的版本 2 安装TortoiseSVN 双击运行程序 出现第一个小坑 原来是你的系统没有打 kb299 ...
- 微信小程序的账号找回。
之前注册过微信小程序,好久没用了,马上要开发微信小程序了,我今天登陆了一下突然发现 然后点击账号找回,按照流程同意点击下一步,到第二部时要输入搜索框里的提示. 这时的我早已忘了,百度搜了一下如何找回原 ...
- django—模板相关
关于在html文件中使用模板语言时,一些符号的含义 {{}}:显示变量相关,在模板渲染的时候替换成值 {%%}:处理逻辑相关 django模板语言中,对于列表字典等容器类型,不能够通过[ 索引/键值 ...
- Linux 动态库加载
动态库运行时搜索顺序 1.LD_PRELOAD LD_PRELOAD是一个环境变量,用于动态库加载,动态库加载的优先级最高: 2.-wl,-rpath 编译目标代码时指定的动态库搜索路径(指的是用-w ...
- return i++ 是先用再加么
return i++ 比较特殊,先是return i:然后i++. return i=i+ 1 则不同,它是先让i=i+1,再return