企业级接口的返回对象一般都是status+data的形式,即接口是否返回成功,以及接口返回的数据是什么,这里我们来定义一下通用的通用对象返回的格式。
1、首先在码云新建一个分支,common-api,然后在本地拉取代码,这部分内容前面讲过,这里就省略了。
2、我们新建一个package名字为response,包下面新建一个CommonReturnType的类,用来定义通用返回对象。如下图:
下面我们来看一下这个CommonReturnType的内容:
//处理接口返回数据类型,使用status和data的格式返回数据
public class CommonReturnType {
//请求结果,success和fail
private String status;
//若status=success,则data内返回前端需要的json数据
//若status=fail,则data内使用通用的错误码格式
private Object data;
//定义一个通用的创建方法
public static CommonReturnType creat(Object result){
return CommonReturnType.creat(result,"success");
}
//使用了函数重载的方式做了一个构造方法
public static CommonReturnType creat(Object result,String status){
CommonReturnType type=new CommonReturnType();
type.setStatus(status);
type.setData(result);
return type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
这个方法是说当Controller完成相应的逻辑以后调用creat方法,如果不带status参数米那就默认status的参数是“success”,然后创建了对应的CommonReturnType,并且把值返回。下面我们来看一下如何在Controller中使用这个CommonReturnTYpe。
3、使用CommonReturnType
由上图可知,我们在Controller中做了下面的改变:
我们不再返回UserVO对象,而是返回了一个通用的返回对象CommonReturnType,然后在最后返回的时候使用了return CommonReturnType.creat(userVO)的方法将UserVO对象返回,这里在使用creat方法时,没有加status方法,默认是返回成功“success”。现在我们可以来调试一把我们的程序:
这样我们返回给前端的数据格式就非常规范了,前端的人员也比较好拿到我们返回给他们的数据了。
4、下面我们做一下对异常的处理,即status为fail的时候的处理。
首先我们新建一个error的package,然后在这个包下面新建一个CommonError的接口如下图:
为什么我们要使用interface的形式,我待会会解释这一点,下面我们来看一下CommonError里面的内容:
我们定义了三个方法,分别为获取错误码,获取错误信息和设置错误信息。下面我们再新建一个枚举去实现这些方法如下图:
下面我们来定义一些常见的错误类型:
这里我们定义二零用户不存在和参数不合法两个错误类型,然后在下面的get、set方法中也要改变一下:
下面我们来看一下具体怎么使用这个通用的错误枚举!
5、我们采用抛出异常的形式使用这些通用错误的返回类型,首先新建一个BusinessException,并实现CommonError的方法如下图:
然后新建一个构造函数如下图:
最后改写相应的get、set方法如下:
我们的这种逻辑有一个专门的名字叫做包装器业务异常类实现,就是说BusinessException和我们刚才定义的EmBusinessError,都共同继承了CommonError的方法,使外部可以通过new一个BusinessException或者new一个EmBusinessError的形式都可以获得errorCode和errMsg的内容。说了那么多,下面我们来实践一下:
6、我们在Controller层中这样改变,然后抛出错误异常如下:
下面我们对抛出的异常做一下处理:
我们在controller包下面新建一个BaseController,把一些异常放入这里面如下图:
/**
* @Author: MaHuadong
* @Date: 2019/4/2 15:27
* @Version 1.0
* 把异常处理逻辑放到基类controller里面
* 别的controller只需要继承BaseController即可
*/
public class BaseController {
//定义Exceptionhandle解决未被controller层吸收的exception
@ExceptionHandler(Exception.class)
//即便controller抛出异常,我们捕获它然后正常返回200的值
@ResponseStatus(HttpStatus.OK)
//接收HttpServletRequest和异常Exception,只能返回一个页面路径,若想返回对象,则需要加上下面的注解
@ResponseBody
public Object handleException(HttpServletRequest request, Exception ex){
Map<String, Object> responseData = new HashMap<>();
//如果ex返回的是BusinessException,则把Exception强转为BusinessException
if (ex instanceof BusinessException) {
BusinessException businessException = (BusinessException) ex;
//使用Map存放errCode和errMsg
responseData.put("errCode", businessException.getErrorCode());
responseData.put("errMsg", businessException.getErrorMsg());
}else {
//如果ex返回的是不BusinessException,则直接输出未知错误,我们需要去枚举里面再定义一个未知错误然后返回
//使用Map存放errCode和errMsg
responseData.put("errCode", EmBusinessError.UNKNOW_ERROR.getErrorCode());
responseData.put("errMsg",EmBusinessError.UNKNOW_ERROR.getErrorMsg());
}
//使用构造函数返回data和status
return CommonReturnType.creat(responseData,"fail");
}
}
下面我们来测试一下,
上面我们在controller中加入上面的代码,我们能看到明显的逻辑错误,我们来看一下能返回什么错误:
这里按照我们在EmBusinessError中定义的位置错误:
再换个参数测试一下:
这里我们抛出一个用户不存在的异常,然后运行看一下:
也可以成功返回!说明咱们做的没问题!
到现在咱们的通用返回对象就已经编写完成了,并且测试成功了,现在咱们把代码提交一下,然后进行下一步的开发。
git add .
git commit -m 'common-api'
git push
然后再合并到主分支:
git checkout master
git merge origin/common-api
git push
好了,通用接口返回对象的编写就到这儿了,加油!