1.2. Http响应内容统一封装
我们在开发前端
和后端
进行交互服务过程中,受制于前后端的工作职责明确,在交互协议的定义上理解也较为不同,造成一个项目服务中重复定义交互内容以及编码上重复编写,不利于项目维护。所以基于此,将后端
按照约定请求URL路径,并传入相关参数,后端
服务器接收请求,进行业务处理,返回数据给前端,进行再次封装,供前端以及外部调用。
通常情况下我们后端
返回给前端
都会采用 JSON
的定义,具体如下:
1 | { |
- code状态码
在状态码的定义上,在满足业务需求的基础上,避免凌乱,一般业界同行做法就是参考HTTP请求返回的状态码。
具体如 百度 - HTTP状态码。
这里我贴出我将我项目中的常用的罗列出来,供大家参考。
1 | package xyz.wongs.drunkard.base.message.enums; |
- message内容
这个不解释啦, 就是编码的文字的意义,说清楚就行,没必要太较真,自行脑补。
- data数据
这就是业务具体数据啦,根据具体业务,内容也不同,这一章节也没必要说。
这里小结下,我们除了要有需要定义的内容有两块:返回的JSON消息体(这里区分正常响应返回、异常响应返回),还需要一套状态码详细定义;再有我们这里做的是WEB,既然做通用,怎能少拦截器。
摆脱了繁琐的文字,下面开始张罗着贴实现代码啦。
1.2.1. 消息体
结合我们定义的状态码,我们返回的消息体主要实现一个 Serializable
,不要问我为什么。
1.2.1.1. 正常响应
1 | package xyz.wongs.drunkard.base.message.response; |
1.2.1.2. 异常响应
1 | package xyz.wongs.drunkard.base.message.response; |
这样两个消息体就写完啦。
1.2.2. 拦截器
我们这里需要做的就是利用拦截器拦截请求,检查判断是否此请求返回的值需要包装。核心就是判断一个注解annoation
是否存在方法或类中。
为了演示的完整,我将代码贴完整。
1.2.2.1. Annoation注解
1 | /** |
1.2.2.2. 拦截器
1 |
|
着十几行代码的核心处理逻辑,就是获取此请求Annoation注解,是否需要返回值包装,并设置一个属性标记,交由下一处理ResponseResultHandler
来具体封装返回值。
细心的人会发现这里只处置正常成功的内容返回,对于异常的内容并未处置。关于异常处置我理解统一放在一起来编写,这样代码结构性会更好。由此引出下一章节,全局异常
。
1 | package xyz.wongs.drunkard.base.handler; |
1.2.2.3. 全局异常
这里所有的异常都使用到 ErrorResult
类。
1 | package xyz.wongs.drunkard.base.message.exception; |
1.2.3. 例子
以上虽然将所有代码贴出,这列为凑完整,顺道将写个例子来,写个 Controller
1 | package xyz.wongs.drunkard.war3.web.controller; |
访问 http://localhost:9090/region/ip=109.27.45.12
这是我之前一个例子,用来解析IP地址,获取地域信息的。