如何选择邯郸做网站,广告制作网站,wordpress设置自定义主页,技能培训班有哪些课程来源#xff1a;老顾聊技术前言接口交互返回格式控制层Controller美观美化优雅优化实现方案前言在移动互联网#xff0c;分布式、微服务盛行的今天#xff0c;现在项目绝大部分都采用的微服务框架#xff0c;前后端分离方式#xff0c;(题外话#xff1a;前后端的工作职责… 来源老顾聊技术前言接口交互返回格式控制层Controller美观美化优雅优化实现方案前言在移动互联网分布式、微服务盛行的今天现在项目绝大部分都采用的微服务框架前后端分离方式(题外话前后端的工作职责越来越明确现在的前端都称之为大前端技术栈以及生态圈都已经非常成熟以前后端人员瞧不起前端人员那现在后端人员要重新认识一下前端前端已经很成体系了)。一般系统的大致整体架构图如下需要说明的是有些小伙伴会回复说这个架构太简单了吧太low了什么网关啊缓存啊消息中间件啊都没有。因为老顾这篇主要介绍的是API接口所以我们聚焦点其他的模块小伙伴们自行去补充。接口交互前端和后端进行交互前端按照约定请求URL路径并传入相关参数后端服务器接收请求进行业务处理返回数据给前端。针对URL路径的restful风格以及传入参数的公共请求头的要求(如app_version,api_version,device等)老顾这里就不介绍了小伙伴们可以自行去了解也比较简单。后端服务器如何实现把数据返回给前端返回格式后端返回给前端我们一般用JSON体方式定义如下{ #返回状态码 code:integer, #返回信息描述 message:string, #返回值 data:object}CODE状态码code返回状态码一般小伙伴们是在开发的时候需要什么就添加什么。如接口要返回用户权限异常我们加一个状态码为101吧下一次又要加一个数据参数异常就加一个102的状态码。这样虽然能够照常满足业务但状态码太凌乱了我们应该可以参考HTTP请求返回的状态码下面是常见的HTTP状态码200 - 请求成功301 - 资源(网页等)被永久转移到其它URL404 - 请求的资源(网页等)不存在500 - 内部服务器错误我们可以参考这样的设计这样的好处就把错误类型归类到某个区间内如果区间不够可以设计成4位数。#10001999 区间表示参数错误#20002999 区间表示用户错误#30003999 区间表示接口异常这样前端开发人员在得到返回值后根据状态码就可以知道大概什么错误再根据message相关的信息描述可以快速定位。Message这个字段相对理解比较简单就是发生错误时如何友好的进行提示。一般的设计是和code状态码一起设计如再在枚举中定义状态码状态码和信息就会一一对应比较好维护。Data返回数据体JSON格式根据不同的业务又不同的JSON体。我们要设计一个返回体类Result控制层Controller我们会在controller层处理业务请求并返回给前端以order订单为例我们看到在获得order对象之后我们是用的Result构造方法进行包装赋值然后进行返回。小伙伴们有没有发现构造方法这样的包装是不是很麻烦我们可以优化一下。美观美化我们可以在Result类中加入静态方法一看就懂那我们来改造一下Controller代码是不是比较简洁了也美观了。优雅优化上面我们看到在Result类中增加了静态方法使得业务处理代码简洁了。但小伙伴们有没有发现这样有几个问题1、每个方法的返回都是Result封装对象没有业务含义2、在业务代码中成功的时候我们调用Result.success异常错误调用Result.failure。是不是很多余3、上面的代码判断id是否为null其实我们可以使用hibernate validate做校验没有必要在方法体中做判断。我们最好的方式直接返回真实业务对象最好不要改变之前的业务方式如下图这个和我们平时的代码是一样的非常直观直接返回order对象这样是不是很完美。那实现方案是什么呢实现方案小伙伴们怎么去实现是不是有点思路在这个过程中我们需要做几个事情1、定义一个注解ResponseResult表示这个接口返回的值需要包装一下2、拦截请求判断此请求是否需要被ResponseResult注解3、核心步骤就是实现接口ResponseBodyAdvice和ControllerAdvice判断是否需要包装返回值如果需要就把Controller接口的返回值进行重写。注解类用来标记方法的返回值是否需要包装拦截器拦截请求是否此请求返回的值需要包装其实就是运行的时候解析ResponseResult注解此代码核心思想就是获取此请求是否需要返回值包装设置一个属性标记。重写返回体上面代码就是判断是否需要返回值包装如果需要就直接包装。这里我们只处理了正常成功的包装如果方法体报异常怎么办处理异常也比较简单只要判断body是否为异常类。怎么做全局的异常处理篇幅原因老顾这里就不做介绍了只要思路理清楚了自行改造就行。重写Controller在控制器类上或者方法体上加上ResponseResult注解这样就ok了简单吧。到此返回的设计思路完成是不是又简洁又优雅。这个方案还有没有别的优化空间当然是有的。如每次请求都要反射一下获取请求的方法是否需要包装其实可以做个缓存不需要每次都需要解析。当然整体思路了解小伙伴们就可以在此基础上面自行扩展程序汪往期精彩文章程序汪最近整理的BAT大小厂面试题(面试题目录推荐)目录我把精华文章都整理出来了Java硕士京东工作1年跳槽后他期望薪资26K大家感觉他可以吗经验分享一本学历大三Java粉丝顺利拿下实习offer他放弃了考研经验分享Java1年经验16K外派支付宝你们说香吗面经分享毕业西电Java工作3年拿到了30Koffer经验分享36000元培训1年半Java一个培训踩坑经历给个[在看]是对程序汪最大的支持