返回顶部
首页 > 资讯 > 前端开发 > html >怎么重构出优雅后台API接口
  • 235
分享到

怎么重构出优雅后台API接口

2024-04-02 19:04:59 235人浏览 安东尼
摘要

本篇内容主要讲解“怎么重构出优雅后台api接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重构出优雅后台API接口”吧!展示具体重构代码之前,我们先来看下

本篇内容主要讲解“怎么重构出优雅后台api接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重构出优雅后台API接口”吧!

展示具体重构代码之前,我们先来看下原先对外 API 接口是如何开发的。

这个 API 接口主要是用来与我们 APP 交互,这个过程我们统一定义一个交互协议,APP 端与后台 API 接口统一都使用 JSON 格式。

另外后台 API 接口对 APP 返回时,统一一些错误码,APP 端需要根据相应错误码,在页面弹出一些提示。

下面展示一个查询用户信息返回的接口数据:

{     "code": "000000",     "msg": "success",     "result": {         "id": "1",         "name": "test"     } }

code代表对外的错误码,msg代表错误信息,result代表具体返回信息。

前端 APP 获取这个返回信息,首先判断接口返回 code是否为 「000000」,如果是代表查询成功,然后获取 result  信息作出相应的展示。否则,直接弹出相应的错误信息。

重构之前

下面我们来看下,重构之前的,后台 API 层的如何编码。

 @RequestMapping("testv1") public APIResult testv1() {     try {         User user = new User();         user.setId("1");         user.setName("test");         return APIResult.success(user);     } catch (APPException e) {         log.error("内部异常", e);         return APIResult.error(e.getCode(), e.getMsg());     } catch (Exception e) {         log.error("系统异常", e);         return APIResult.error(RetCodeEnum.FaiLED);     } }

上面的代码其实很简单,内部统一封装了一个工具类 APIResult,然后用其包装具体的结果。

@Data public class APIResult<T> implements Serializable {      private static final long serialVersionUID = 4747774542107711845L;      private String code;      private String msg;      private T result;       public static <T> APIResult success(T result) {         APIResult apiResult = new APIResult();         apiResult.setResult(result);         apiResult.setCode("000000");         apiResult.setMsg("success");         return apiResult;     }      public static APIResult error(String code, String msg) {         APIResult apiResult = new APIResult();         apiResult.setCode(code);         apiResult.setMsg(msg);         return apiResult;     }      public static APIResult error(RetCodeEnum codeEnum) {         APIResult apiResult = new APIResult();         apiResult.setCode(codeEnum.getCode());         apiResult.setMsg(codeEnum.getMsg());         return apiResult;     }

除了这个以外,还定义一个异常对象 APPException,用来统一包装内部的各种异常。

上面的代码很简单,但是呢可以说比较繁琐,重复代码也比较多,每个接口都需要使用 try...catch 包装,然后使用  APIResult包括正常的返回信息与错误信息。

第二呢,接口对象只能返回 APIResult,真实业务对象只能隐藏在 APIResult中。这样不太优雅,另外不能很直观知道真实业务对象。

重构之后

下面我们开始重构上面的代码,主要目的是去除重复的那一坨try...catch 代码。

这次重构我们需要使用spring 注解 @ControllerAdvice以及 ResponseBodyAdvice,我们先来看下重构的代码。

ps: ResponseBodyAdvice来自 Spring 4.2 API,如果各位同学需要使用这个的话,可能需要升级 Spring 版本。

改写返回信息

首先我们需要实现 ResponseBodyAdvice,实现我们自己的处理类。

@ControllerAdvice public class CustomResponseAdvice implements ResponseBodyAdvice {          @Override     public boolean supports(MethodParameter methodParameter, Class aClass) {         System.out.println("In supports() method of " + getClass().getSimpleName());         return true;     }           @Override     public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {         System.out.println("In beforeBodyWrite() method of " + getClass().getSimpleName());         if (body instanceof APIResult) {             return body;         }         return APIResult.success(body);     } }

实现上面的接口,我们就可以在 beforeBodyWrite方法里,修改返回结果了。

上面代码中,只是简单使用  APIResult包装了返回结果,然后返回。其实我们还可以在此增加一些额外逻辑,比如说如接口返回信息由加密的需求,我们可以在这一层统一加密。

另外,这里判断一下 body 是否 APIResult类,如果是就直接返回,不做修改。

这么做一来兼容之前的老接口,这是因为默认情况下,我们自己实现的 CustomResponseAdvice类,将会对所有的 Controller  生效。

如果不做判断,以前的老接返回就会被包装了两层 APIResul,影响 APP 解析。

除此之外,如果大家担心这个修改对以前的老接口有影响的话,可以使用下面的方式,只对指定的方法生效。

首先自定义一个注解,比如说:

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CustomResponse { }

然后将其标注在需要改动的方法中,然后我们在 ResponseBodyAdvice#supports中判断具体方法上有没有自定义注解  CustomResponse,如果存在,返回 true,这就代表最后将会修改返回类。如果不存在,则返回 false,那么就会跟以前流程一样。

 @Override public boolean supports(MethodParameter methodParameter, Class aClass) {     System.out.println("In supports() method of " + getClass().getSimpleName());     Method method = methodParameter.getMethod();     return method.isAnnotationPresent(CustomResponse.class); }

全局异常处理

上面的代码重构之后,将重复代码抽取了出来,整体的代码就剩下我们的业务逻辑,这样就变得非常简洁优雅。

不过,上面的重构的代码,还是存在问题,主要是异常的处理。

如果上面的业务代码抛出了异常,那么接口将会返回堆栈错误信息,而不是我们定义的错误信息。所以下面我们这个,再次优化一下。

这次我们主要需要使用 @ExceptionHandler注解,这个注解需要与 @ControllerAdvice 一起使用。

@Slf4j @ControllerAdvice public class CustomExceptionHandler {      @ExceptionHandler(Exception.class)     @ResponseBody     public APIResult handleException(Exception e) {         log.error("系统异常", e);         return APIResult.error(RetCodeEnum.FAILED);     }      @ExceptionHandler(APPException.class)     @ResponseBody     public APIResult handleAPPException(APPException e) {         log.error("内部异常", e);         return APIResult.error(e.getCode(), e.getMsg());     }  }

使用这个 @ExceptionHandler,将会拦截相应的异常,然后将会调用的相应方法处理异常。这里我们就使用  APIResult包装一些错误信息返回。

到此,相信大家对“怎么重构出优雅后台API接口”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么重构出优雅后台API接口

本文链接: https://lsjlt.com/news/84280.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么重构出优雅后台API接口
    本篇内容主要讲解“怎么重构出优雅后台API接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重构出优雅后台API接口”吧!展示具体重构代码之前,我们先来看下...
    99+
    2024-04-02
  • thinkphp6怎么搭建后端api接口
    本篇内容介绍了“thinkphp6怎么搭建后端api接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、下载tp6我使用的是集成环境php...
    99+
    2023-06-29
  • 在Laravel中创建API接口出错怎么办
    这篇文章主要介绍在Laravel中创建API接口出错怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Laravel 中创建了API 接口。 当前端发送POST请求时, 查看 n...
    99+
    2024-04-02
  • vue怎么部署包可配置后台接口地址
    这篇文章主要介绍“vue怎么部署包可配置后台接口地址”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么部署包可配置后台接口地址”文章能帮助大家解决问题。有时候一个部署包可能要应用于不同服务器,...
    99+
    2023-07-05
  • js原生小程序怎么封装请求优雅地调用接口
    本篇内容介绍了“js原生小程序怎么封装请求优雅地调用接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基于小程序原生request封装Pro...
    99+
    2023-06-21
  • java后台调用接口及处理跨域问题怎么解决
    这篇文章主要介绍“java后台调用接口及处理跨域问题怎么解决”,在日常操作中,相信很多人在java后台调用接口及处理跨域问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java后台调用接口及处理跨域...
    99+
    2023-06-29
  • vue项目打包之后接口出现错误怎么解决
    本篇内容介绍了“vue项目打包之后接口出现错误怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!错误信息这是新建一个项目还原问题,nod...
    99+
    2023-06-30
  • springboot vue测试平台接口定义前后端新增功能怎么实现
    这篇文章主要讲解了“springboot vue测试平台接口定义前后端新增功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot vue测试平台接...
    99+
    2023-07-06
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作