针对于现在各种移动设备和小程序,都可以调用接口来请求服务,一般在PC端调用接口产生异常,比如返回500的状态码,展示对应的错误信息,但是针对移动设备端的接口请求,当状态码为500的时候,就会判断成这个请求是错误的,无法拿到错误信息,针对此问题,在使用guns开源框架的时对其全局异常进行改造处理,一起来看一下吧!
解决问题的思路:获取请求头中的【User-Agent】来判断请求的设备类型,再针对设备类型进行返回状态码处理。
1、定义移动端的请求【User-Agent】数组,基本以下现在的移动端的都包含了
对于"Okhttp"的深入了解可以参照这位的简书:
[Okhttp3基本使用](https://www.jianshu.com/p/da4a806e599b)
/**
* 手机端User-Agent
*/
public static final String[] agent = {"okhttp","Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser"};
2、定义方法,根据请求判断是否是移动设备,如果是移动设备则将返回码替换为200,如果是非移动端则使用原默认的状态码。
/**
* 设置返回的状态码 如果是小程序则全部设置为200
* @param request 请求
* @param response 响应
* @param statusCode 原需求配置的状态码
*/
public void setStatus(HttpServletRequest request,HttpServletResponse response,Integer statusCode){
//判断是否是小程序 如果是小程序则全作为200处理
Integer defaultHttpStatus = statusCode;
String userAgent = request.getHeader("User-Agent");
for (String agent : Const.agent) {
//判断是否是移动设备请求
if (userAgent.contains(agent)) {
defaultHttpStatus = HttpStatus.OK.value();
}
}
response.setStatus(defaultHttpStatus);
}
3、找到guns的全局异常配置类,修改内容。
全局异常配置类的位置:
对自己需要修改的异常进行代码修改。
比如这个认证异常:原框架代码
/**
* 认证异常--认证失败(账号密码错误,账号被冻结,token过期等)
*
* @author fengshuonan
* @Date 2020/2/6 11:14 上午
*/
@ExceptionHandler(AuthException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//框架代码在这设置了返回码
@ResponseBody
public ErrorResponseData unAuth(AuthException e,HttpServletRequest request, HttpServletResponse response) {
return new ErrorResponseData(e.getCode(), e.getMessage());
}
更改代码为:
/**
* 认证异常--认证失败(账号密码错误,账号被冻结,token过期等)
*
* @author fengshuonan
* @Date 2020/2/6 11:14 上午
*/
@ExceptionHandler(AuthException.class)
@ResponseBody
public ErrorResponseData unAuth(AuthException e,HttpServletRequest request, HttpServletResponse response) {
//设置状态码
setStatus(request,response,HttpStatus.UNAUTHORIZED.value());
return new ErrorResponseData(e.getCode(), e.getMessage());
}
通过以上设置就可以针对不同的设备进行返回状态码的处理了!