在移动互联网,分布式和微服务盛行的今天,现在大部分项目都使用微服务框架,前后端分离。图片来自Pexels题外话:前后端的岗位职责越来越明确。现在前端被称为大前端,技术栈和生态系统都非常成熟;以前后台看不起前台,现在后台要重新开始。认识一下前端,前端已经很系统了。通用系统的通用整体架构图如下:需要说明的是,有小伙伴会回复说这个架构太简单太low,没有网关,没有缓存,没有消息中间件。因为我这篇文章主要是介绍API接口,所以我们划重点,其他模块小伙伴可以自行补充。界面交互前端和后端交互。前端根据约定请求URL路径,并传入相关参数。后端服务器接收请求,进行业务处理,返回数据给前端。对于URL路径的restful风格,以及传入参数的公共请求头的要求(如:app_version、api_version、device等),这里不再介绍。小伙伴们可以自学,比较简单。我会重点介绍后端服务器如何向前端返回数据?返回格式后端返回给前端。我们一般使用JSONbody方法,定义如下:{#返回状态码code:integer,#返回信息描述message:string,#返回值data:object}①CODE状态码Code返回状态码。一般朋友在开发的时候需要什么就加什么。如果接口要返回用户权限异常,我们加状态码101,下次需要加数据参数异常,加状态码102。虽然这样可以满足业务正常,但是状态码太乱了。我们应该可以参考HTTP请求返回的状态码。以下是常见的HTTP状态码:200-请求成功301-资源(网页等)被永久转移到另一个URL404-请求的资源(网页等)不存在500-内部服务器错误,可以参考对于这个设计,它将错误类型分类到一定范围内。如果范围不够,可以设计成4位。#1000~1999range表示参数错误#2000~2999range表示用户错误#3000~3999range表示接口异常这样前端开发人员在得到返回值后可以根据状态码知道大概的错误,然后根据Message相关信息描述,可以快速定位。②message字段理解起来比较简单,就是发生错误时如何进行友好提示。一般设计是和Code状态码一起设计,比如:在枚举中定义,状态码:状态码和信息会一一对应,更容易维护。③Data返回数据体,JSON格式,根据业务不同返回不同的JSON体。我们要设计一个返回体类Result:控制层Controller我们会在Controller层处理业务请求,返回给前端。以Order订单为例:我们看到在获取到Order对象后,我们使用Result构造方法进行封装Assign,然后返回。小伙伴们有没有发现构造方法的打包不是很麻烦,我们可以优化一下。漂亮的优化我们可以在Result类中加入静态方法,一看就懂:那我们改造一下Controller:代码不是更简洁漂亮吗?优雅优化上面我们看到在Result类中增加了一个静态方法,使得业务处理代码简洁。但是小伙伴们有没有发现这种方式有几个问题:每个方法返回的都是一个Result封装的对象,没有业务意义。在业务代码中,成功时调用Result.success,异常时调用Result.failure。是不是多余。以上代码判断id是否为null。其实我们可以使用hibernatevalidate进行验证,不需要在方法体中进行判断。我们最好的办法就是直接返回真正的业务对象,而且最好不要改变之前的业务方法,如下图:这个和我们平时的代码一样,很直观,直接返回订单对象,就是这完美?实施计划为何?你们对如何实施实施计划有什么想法吗?在这个过程中,我们需要做几件事:定义一个注解@ResponseResult,表示需要对这个接口返回的值进行封装。拦截请求,判断请求是否需要注解@ResponseResult。核心步骤是实现接口ResponseBodyAdvice和@ControllerAdvice,判断返回值是否需要封装,必要时重写Controller接口的返回值。①注解类用于标记方法的返回值,是否需要打包:②拦截器拦截请求,本次请求返回的值是否需要打包,其实就是解析@ResponseResult注解跑步时。这段代码的核心思想是获取请求,是否需要包装返回值,并设置一个属性标志。③重写返回体上面的代码是判断是否需要对返回值进行包装,需要的话直接进行包装。这里我们只处理正常和成功的打包。方法体报异常怎么办?处理异常也比较简单,只要将body判断为异常类即可。如何做全局异常处理,限于篇幅,老谷这里就不介绍了,只要思路清晰,大家可以自己修改。④重写Controller,在控制器类或方法体上加上@ResponseResult注解,这样就OK了,简单。到这里返回的设计思路就完成了,是不是简洁大方?综上所述,这个方案还有没有其他可以优化的地方?当然有。比如:每个请求都需要体现,获取请求的方法是否需要封装,其实可以缓存,不需要每次都去解析。当然,如果了解了整体思路,可以在此基础上进行扩展。谢谢你!!!作者:老顾编辑:陶家龙来源:https://www.toutiao.com/i6694404645827117572
