00:01
那前面呢,我们讲了SPA的一个基本的配置,那这堂课呢,我们来讲一下统一返回结果,那什么叫做统一返回结果呢?我们先来看一下之前我们写的两个接口。在我们前面写到的这个两个接口当中呢,有啊这样两个功能,一个呢是返回一个列表,一个呢是删除一条记录,那么这两个接口呢,分别返回不同的数据类型,第一个呢,返回的是list集合数据类型,第二个呢是返回布尔啊好,那这种结果呢,其实我们发送给前端的时候呢,前端有的时候啊,它会对这个结果呢有一些啊就是。有一些不同的解释,比如说像返回列表这个还好,I cut一下返回的是列表对吧,一目了然好,然后呢,如果要是上面的这个。下面的这个啊,我这个这是什么意思呢?这个到底是数据删除失败呢,还是嗯服务器发生了错误呢,这个就不太好理解了,我们也不知道啊,它到底是这个接口调用出错了,还是数据删除失败了,还是没有删除成功啊,所以呢,这样的话呢,我们在前后端联调的过程当中呢,就会引起一些歧义,那么可能会有一些更多的沟通成本,这个时候前端在调用我们后端接口的时候呢,他就要去来主动和我们和后端沟通,然后看一看这个是不是真的出现了问题,然后一看啊,不是有问题,是这个业务逻辑就是这样的,对不对啊,所以呢,呃,我们其实呢,是想把这个呃送给前端的结果呀,描述的更清楚一些,到底是接口调用失败了,还是业务逻辑啊,返回了一个false值,那所以呢,一般情况下呢,针对这些返回结果的话,我们都会统一定义。
01:57
啊,一些固定的内容啊,那么呃,针对返回结果,我们都会定义什么样的一些固定的内容呢?至少要有这三个,第一就是返回码啊,比如说返回码为零,我们就认为它是成功啊,然后比如说像刚才的那个。
02:12
我们就可以给它定义为返回码是零对吧,就是如果删除失败,我们返回码是零,就说明整个的业务逻辑是成功的啊,只不过呢啊,就是整个的调用是成功的,只不过业务逻辑那块呢,它只是没有成功的删除而已,好然后这个message呢,就是呃,返回的这个消息,具体的消息,然后这个data这块呢,就是返回的这个呃,具体的数据,如果是有数据的话,那我们会返回一个数据,好,那所以呢,这个就是我们整个的一个统一返回结果的一个定义,然后这块失败,失败也是一样的啊,Code等于负一,我们说是一个失败的一个情况,而message就是失败,然后一般失败的话,我们是没有任何数据返回的,所以对data塔呢,就是等于塔,那这样的话呢,我们就让我们的这个返回结果呢,有三个值,一个是业务响应码,这是数值类型的,一个呢是返回的消息,这个可以是字串类型的,还有一个呢是返回的数据,这个呢可以是对象类型的啊一对象类型呢,它既可以是返回一个列表,也可以呢返回一个。
03:13
独立的对象也可以呢,返回一个map集合等等等等啊,所以这个对象类型呢,它就比较灵活啊,然后你没有什么返回值的时候呢,那你就这个对象保持为空也可以,好那接下来呢,针对我们现在定义的这样的一个返回结果呢,我们来创建两个类啊,一个是枚举,一个呢是我们的统一结果类,好我先把这个枚举创建出来。我把这个枚举呢,创建在我们的古丽common中,在古丽common中呢,咱们定义这样的一个包。好,然后接下来呢,我们来创建这个枚举。
04:01
我们给这个枚举起一个名字,我看一下叫什么叫response枚举吧,Response in,选这个枚举。好,然后接下来呢,这个枚举里面呢,我们呢,想定义呃,两个成员,一个成员呢是private in code,就是我们的响应码,还有一个呢,就是我们的响应信息private准。MY,那这也是我们的响应信息,一般情况下呢,我们的一个响应码呢,可能会对应一个不同的响应信息,所以呢,我们把他们作为这个枚举的成员,然后呢,我们希望呢,这个枚举的响应码和响应信息呢,可以通过钙的方法给他获取到,这样的话呢,我们就。写这样的一个,嗯。枚举的一个get啊,有了枚举的get之后呢,在我们的这个枚举里面呢,它就会针对每一个成员呢,给我们生成一个get方法了啊,这个是枚举的一个定义,然后接下来后面为了这个输出方便呢,我们再给它生成一个to string方法,这也是longb里面的啊,那如果在longb当中,你写data的话,那它就会生成所有的这些内容,包括get,包括set,包括等等,那现在呢,我不想生成那么多,我只想根据我的需求来生成,所以呢,这个地方呢,我们就可以单独的去写你需要的方法,这是get,这是to转,然后接下来呢,我还想生成一个就是啊全参构造函数,所谓的全仓构造函数呢,就是啊接收code和message参数的构造函数,那我们可以这样写,叫呃X controller,这样的话呢,大家看在这个地方呢,它就会有一个全参构造函数生成了,哈,好,然后再接下来呢,在这个枚举中呢,我还想。
05:54
想生成这个当然了,你这咱们定的是枚举是吧,你得有枚举啊,好,我们来写枚举,枚举呢,我们来调用刚才我们这个全仓构造函数来创建我们具体的枚举,那全仓构造函数的话,呃,就是由接收两个参数,一个呢是响应码,一个呢是响应消息,那这个枚举的名字我们可以自己定义一下,比如说我们先定义两个枚菌sus,好,然后呢,调用刚才的全团构造函数,一个是零,然后呢一个是成功,好,这是我们定义的第一个枚举了,那接下来呢,在这里面呢,因为它这个枚举嘛,所以可以有很多类似的这样的一些其他的值,那么再定一个,比如说叫I,这是错误,错误的话呢,我们认为它是负一啊,我们直接给它定一个错误的反应法,这块是服务器内部错误好吧,所以呢,这块呢,就是我们整个的一个。
06:49
啊,枚举的一个定义,然后这块呢是响应状态码,这块呢是响应信息,响应状态嘛,这个呢是响应信息,好,然后嗯,接下来呢,我们再来看一下这个枚举我们怎么去用,我们要将它用在我们定义的这个统一结果类里面,所以呢,在这个地方呢,我们在定义一个统一结果类。
07:19
叫result啊,那这个统一结果呢,我们用的是最多的一个这个类了,所以呢,我们就简单点写,就写R哈,一个字母就够用了,R呢就是result的意思,然后接下来呢,在这个地方呢,我们要用private in啊,然后呢,有一个cold a private。Message,好,然后还能有一个数据,就是刚才我们在文档当中分析的这三部分内容,叫做。数呃,响应码,返回消息和对象,这个对象呢,为了更灵活,我们给它定义成一个集合类型的,所以呢是map助object data等于六哈西map。
08:11
好,那这块呢,就是我们整个定义的这样的一个数据了,然后呢。我们在这个下面呢去呃,因为整个的这个R对象的创建呢,我们不希望呃,外部的方法呢,通过构造函数来创建它,所以呢,我们先将构造函数私有化,就防止被外部直接调用啊,那么外部如果不能直接调用它的话,我想怎么去调用它呢?啊,我想去通过我自己定义的一些静态方法来调用它,比如说我要对应一个静态的。呆take,然后R啊,然后OK定义这样的一个静态方法,那这个静态方法呢,我来拗一个二对象好,那内部呢类的内部呢是可以调用这个私有方法的,所以这样的话我就可以拗出来了,弄出来之后呢,然后我用r.side code的,那我要给我这些生成盖塞的方法,所以呢,我在这边呢写data好,所以这块呢,我就可以写S扣,然后呢塞扣啊S扣的什么呢?这个如果是正确的响应结录的话呢,我希望呢就拿直接拿到枚举当中的嗯响应的嗯码和响应的这个。
09:26
消息就可以了,所以呢是类bus sun.s然后点开扣,这是我从枚举当中直接配置好的一个三维码,然后接下来呢,2.setmessage,那么我也从枚举当中呢,拿到我直接配置好的,也是针对于success配置好的这个message,好吧,啊,然后所以这就是一个正确的结果,然后呢,我们再RETURN2就可以了。啊,所以这块呢,就是当我们啊这个成功的时候啊,就是调用的这个结果成功的时候,我们就有这样的一个OK的一个返回结果,所以这个是返回成功结果,然后这个呢,是构造函数私有化,好,然后接下来同样的道理,我们再写一个返回失败的结果。
10:34
啊,这块呢,我们就写E。好,然后呢,一既然是返回失败的结果,那我们这块呢,就写E写error啊,好,就这样就可以了啊,然后接下来呢,啊,为了更灵活一点,我们还可以接收一个枚举,因为这块要么就是成功,要么就是失败,有可能呢,我们在这个枚举当中还会有其他的结果啊,那所以呢,就是会有其他的枚举值,所以呢,我们这边呢,也可以接收一个固定的枚举值啊,所以我们可以这样写public static。
11:11
也是返回啊,然后呢,Set result设置一个结果。好,这个结果由哪来呢?由枚举来,我们可以动态的去传递一个枚举类型的一个参数,好,那么如果传枚举类型的参数的话,这面。我们呢,直接呢就可以写这个response um,具体的枚举概括的和response um具体的每句get message就可以了啊,所以这个呢是设置特定的结果。那这块是我们的结果的一个设置了,然后嗯,接下来呢,我们,嗯,在我们前面的这个controller里面啊,可以看一下哈,怎么去用它。
12:07
怎么去用呢?我们打开我们的这个controller。好,然后呢,比如说在积分等级列表这块,我们就不会去return它了,我们return什么呀?Return我们的R对象,因为R是我们的统一返回结果啊,所以在所有的接口的定义当中,我们都要二对项out加enter inmport class啊,上面把我们自己写的这个common result给它引进来,引进来之后呢,这面呢,我们就给它返回一个列表啊,再list,然后我们return什么呢?return2.ok就行,因为只要你获取到了这个列表的话,那么我们这边呢,就呃,返回就是一个成功的结果啊,然后接下来呢,因为r.OK本身返回的就是什么呀,返回的就是这个。你看2.ok。本身返回的就是二倍项对不对,所以在这个地方呢,我们就可以用这种形式去返回一个统一结果,但是我们还需要把这个类呢,返回到我们的前端,所以呢,在R里面我们还要把类似添加进去,也就是说我们要给R。
13:13
R的data塔赋值啊,要给R的data塔赋值,那给R的data塔怎么赋值呢?下面我们再写一个给R的data塔专门赋值的方法,那我们可以这样去写,就是public,也是返回R,然后写一个data,然后因为data是一个键值,对嘛,所以我们接收一个键P,然后再接收一个值value,好,这样的话呢,我们就this点啊data塔点put,然后这块呢,我们写写value,好,然后最后呢,我们return this就可以了,好然后接下来呢,我们在这个位置。就可以直接写点data,然后呢,我们写一个键,这个键呢,比如说我们可以写嗯,List,然后值值呢,我们就可以写,也是刚才返回的这个list就可以了,那么为什么我们在定义这个二对象的时候,要嗯,让这些静态的方法都返回R对象呢?就是。
14:19
他返回他自己是不是啊,你看这都是他返回他自己,这也是他返回他自己,为什么要这样做呢?其实就是为了界面呢,我们可以写串联语法2.okok呢,返回的是他自己,所以这块呢就可以被直接返回,同时呢,因为它返回他自己,他可以继续点它里面的其他的,呃,这个成员这个方法,所以呢就可以直接点给了啊所这就是一个技巧,好然后接下来呢,我们在这个二里面呢,还可以添加一些啊其他的内容,比如说。我呢啊,如果是这样写的话,那么它最终呢,会有就是三个值,我们我们先来预览一下啊,会有三个值,一个是嗯响应码,一个是响应消息,一个是响应数据。
15:16
好,然后呢,我们来刷新一下我们的页面。看一下我们这个积分等级管理里面的积分等级列表,我们try it out execu一下,然后在这个里面呢,我们可以看到这面我们拿到的response body呢,就根据我们的响应结果来展示了,这块的是响应码,这块呢是响应消息啊,这块呢是响应的数据,好,那么有的时候呢,我们同样是成功的一个结果,但是呢,可能有各种各样不同的成功的消息,比如说获取列表成功,比如说删除成功,比如说嗯,保存成功,比如说更新成功,比如说注册成功,对吧,发送短信成功等等等等啊,借款成功,放款成功,那么同样都是成功,这个消息可能不同,所以呢,我们希望呢,这个消息可以被个性化,那这样的话呢,我们嗯希望在这个R对象里面呢,在针对我们的message呢,去做一个,呃,就是设置的一个入口,那所以在这个地方咱们可以写public sta,然后are set。
16:19
我就直接写message行,然后接下来呢,这块呢就是message,然后this.set message,好,然后接下来呢,嗯,把这个message传进去,然后呢,我还是希望this.set message,那我就不写static了,是不是这样就可写this了,好,那我还是希望呢,他返回他自己,所以呢就是return this。那这样的话呢,这个呢,就是帮助我们设置特定的消息,好,然后呢,我们可以在这个地方呢,写一个就是message。
17:04
点还可以继续讲哈,Set message,那叫做获取列表成功。我看一下啊,Return other OK data.list啊,不对,不是send message,刚才我写那方法叫什么名字来着,叫message是不是啊message啊,Message好,然后获取列表成功是吧?那接下来呢,我们再重新刷新一下。好,然后接下来呢,我们在这个地方。再重新预览一下。
18:00
我们来看一下这面的message呢,就变成了获取列表成功了,所以这块呢,就是我们的一个统一响应结果的一个啊具体的一个设置方案,然后另外呢,像下面这个remove ID呢,我们也可以去使用统一奖励结果,在这个地方呢,我们把布尔呢也改成二对项,然后接下来呢,这面呢,我们就。返回一个嗯,Result吧。返回一个result或者是B都行哈,Result,然后接下来呢,我就判断一下if result,如果result是成功的话,是true的话,那我们就return r.OK然后点message叫做。嗯。删除成功是不是删除成功啊。然后这款是有衬。
19:01
r.I然后点message要删除失败,好,这是这样的一个结果,然后接下来呢,我们再预览一下。好,然后呢,我们来刷新一下这个页面。有时候删除ID为一的记录。大家看这面呢,就有了一个更为详细的解释,它就不是管是出和false了,那样的话就出false到底是啥意思,是不是好,现在扣的是零,然后删除成功啊贝塔,然后接下来呢,我再删一遍它。好,那现在扣的是负一删除失败,就明确的告诉前端用户,这个后面是发生了什么是吧?好,那这块呢,是我们对啊,我们的删除功能的一个实现啊,那同时呢,啊,根据这个删除和根据这个get呢,大家也可以看到这个二对象和response in um啊这两个啊怎么是配合起来,然后帮助我们完成一个统一结果的一个实现的,那接下来呢,这个二对象呢,我们还可以再优化一下啊,就是刚才是对message的一个设置,那我们呢,还可以就是未来如果对针对code也有个性化设置的话,设置特定的响应码,我们也可以调用这个方法,所以呢,就给它一个。
20:43
可扩展的这样的一个能力啊,所以这款呢,赛扣这是针对响应码的设置啊,然后这个扣的呢,我们让它是1T个就可以了。好,这个是扣的,然后呢,还有呢,就是这个data,这data这块呢,我们是建值对形式的假设说我们在业务层当中直接拿到了一个数据集合,就是这个东西,直接就是一个map集合的话,那么其实这个map集合我们就没有必要再用建筑桌把它封装进去了,我们就直接复制给这个集合就行了,好所以说如果参数是集合的话呢,我们在这个地方呢,可以这样写,就是参数是集合table还是R,然后呢,这块还是data,我们写一个重载的方法,但是呢,参数直接就是集合map,然后这块呢是string,然后这面呢是object,啊不,然后这块是map,好,接下来呢,这边我们写this.site data。
21:43
然后这边呢,嗯,我们直接就把map就下载进去就可以了,然后后面呢,我们就直接return this就行了,所以这块呢,是整个的一个完整的一个R对象的一个实现,然后另外呢,Response in u这块呢,也不单单只有这两个哈,还有很多其他的,那我们呢,把其他的也给他完善过来,完善过来的话呢,这边我就不写了啊,这面的代码呢,我给大家发下去了哈,在资料里面我们来找一下在。
22:13
资料里面第二部分有一个Java代码,Java代码里面有一个response,咱们把它打开。好,然后从这块儿开始呢,咱们可以给大家复制一下,就所有的这些呢,都是我们后面要定义的这个枚举,咱们就不一一去写它了。然后把这个分号改成逗号,然后在正面加就行了,好这个呢,就是所有后面咱们要用到的名字,比如说SQL语法错误啊,Select请求异常啊,文件上传错误呀,我们都会定义不同的这个啊,错误码的一个编号啊,好,所以这个是嗯,对response in的一个完善。
我来说两句