00:00
咱们首先啊,下午的第一个内容给大家进来说,这个叫统一返回数据格式,就是让我们所有接口都返回相同个人数据,而这么做有什么好处呢?上我也提到过,因为咱在实际的开发中,我们并不是一个人做个项目,如果你自己做项目,那肯定都是你自己的风格,但实际中可能有多人去共同开发一个项目,每个人可能做不同模块,假如说你做讲师模块,那他可能做什么课程模块,他可能做什么分类模块,那这个时候因为每个人的习惯不一样,所以每个人的反应数据应该也不同,假如说你反应触boss,它可能反应零和一,所以这种时候呢,造成我们的接口数据都不一样,会造成最终问题就是前端在解析返回数据的时候特别不方便,因为每个代码接口都不一样,所以咱为了兼顾到所有的这种开发,咱就让接口反应数据都是统一格式,针对这种情况下。
01:00
下咱就开发一个叫统一版数据格式,让所有接口都有相同的格式啊,这是我们用这么一个目的,目的啊就是它一个背景,然后这个怎么做给大家强调啊,在咱实际中,咱们返回数据格式一般都是用这种叫这次数据格式,用它来做返回。咱在上午给大家也曾经说过,我这里写一下啊,就是A的数据格式,你理解为它主要有这么两种格式,一种格式叫对象,一种叫数组,指咱在实际中经常是两种格式的。混合使用,但是本质上就是一个对象数组,就是一个大括号,一个中括号两种形式啊,这叫这次,所以咱现在让我们这个接口中返回的所有数据都是一段bit格式。那咱要反映成什么样子,我下面啊,在我的课件中给大家列出了一种比较常见格式,我强调啊,这个格式呢,就是你以后在实际的工作中,不一定是我这格式,但是这个思路应该都一样的啊,那我们看一下给大家列的格式,咱仔细看啊,看第一个。
02:13
比如说我们现在要返回数据列表,那这格式首先咱看最外边。是不是一个大括号,大括号咱说的是一个对象嘛,因为第各位应该都清楚啊,K value k value,然后你看里边这些都是它的K,比如success处表示它是否成功,Code的2万,这表示他一个状态码,比如说咱们之前学过HTP请求中什么200啊,404状态码,而后咱们可以自己定状态码,比如咱们约定2万是成功,然后下面有你的消息就是成功,最后一个叫date date中呢我们加一个it,然后这是一个数组,这数组中就是我们的具体数据啊,所以咱一会儿把数据又给它变成这个样子啊,这是一个普通格式,既有对象又数组。
03:02
比如说这里边当我们有一个叫分页数据,那里面就多了一个东西叫这个total。Total什么意思呢?这单词是不是有总共的意思啊,它就表示啊,咱返回我们的这个数据,一共有多少就是多少条数据,比如你表中17条数据,把它返回啊,也是这个结构,就是前面你发现啊,都是success code message data,然后里边有你不同的内容啊,但是结构是不变的。另外比如说我们现在没有反应数据,假如咱们做什么删除成功,那我反映它,如果你失败,咱就给他变成失败,或者变成了20001啊,这是我们要反格式,也就是说不管你是做列表功能,还是添加修改删除功能,咱们让它都统一返回这么一个格式啊,这是我们要做到的这么一个效果啊。然后这个格式大概怎么做,咱来仔细观察一下啊,大家仔细看啊。
04:00
首先咱就以这个为例啊,咱看啊,首先就是前面这个部分应该都是固定的,就是keep success code message date是固定的,然后再看后面这些值的类型,咱一个来看啊,也是为了我们写代码方便。大家看第一个啊,这个size。这值是不是叫触,包括你失败是不是叫false,所以它的类型是不是一个布尔类型啊,这是第一个,然后第二个叫code,就是状态码,比如你成功是2万,失败是20001,那这个类型应该是一个int类型,第三个message,就是你的提示信息成功失败,这应该是个字符串。然后大家看最后的这部分。这一部分是个什么类型的啊,咱仔细看啊,就是这个类型呢,你要说的话有多种这种表现方式,那咱用一种最直接的方式,什么方式呢?大家注意啊,这个最明显,你看啊,这是名称,这是值,这是名称,这是值,值这个值是个数组,那咱这个类型是不是可以用一个map集合型表示map与map结构是不是k value,这是K,这是value,这是K,这是value啊,所以咱们现在这么来表示。
05:16
也就是说最终的效果就是咱们的这种格式。我把这个啊给大家复制到我这个图上来啊,咱就用这种形式来做这个开发,然后这种形式咱来看啊,首先这个word类型就是是否成功code数类型状态嘛,Message是一个四符串的反信息,Date是一个哈希map,就是根据键值对往里面放东西。啊,这个是咱们要做的这么一个。统一反映结果啊,所以咱把它做一个说明,然后这个说完之后,咱下面啊,就把这个代码我们来具体写一下。咱们看这个该怎么做。啊,给大家写一下啊。首先第一个你要明确啊,咱上午说过一个思路,大家注意,不知道这个是否记得啊,咱上午把swaer是不是在common里边做了一个整合呀,因为咱们提到过这swagger你在很多模块中都要用到,所以大家给他放到我们的公共模块中。
06:18
而现在同样咱这个统一返回结果,我们所有的模块是不是也都需要用了,所以咱把这个统一返结果也给它放到咱们的common里边,在里边做这个统一反应结果啊,这是我们要做的事情,就是把它放到咱的common里边做操作,那怎么做,我把步骤给大家写一下啊。咱一步来做啊。首先第一步操作,咱就在这个common的模块里边创建一个子模块。比如说我们给它起个名字,我就跟课件中一样了啊,我就叫这个common us。啊,Common us,或者说你可以写到我们上午那个模块中啊,我就单独建模块,专门写这个统一机构返回我们叫common us,这是我们要做的第一步,那咱在里边写一下啊,注意common中创建,那咱点common右键建一个叫model里边啊,咱还是选一个微工程,然后下一步我们选择叫这个common_us。
07:24
点下一步,最终完成。把这个我们先创建,这叫common us啊,这做到了。然后这个做到之后啊,当然咱在common里边呢,把那些依赖都引入了,所以它的子模块中可以直接用,咱们在common中那些相关依赖啊,都可以用一下。然后这个做到之后,咱们下面往下来做。啊,这个大家寄过来啊,在里边建了一个模块,叫这个common。啊,这是我们说的第一步操作。啊,咱上午这种方式都创建过了啊,然后这个做到之后,咱下面进入到我们的第二步操作。
08:04
那第二步做什么呢?咱肯定是在里边啊,写那些就是相关的代码部分了,那代码写什么,咱先大概看一下啊,我强调啊,这个代码其实写法比较固定啊,但是我给各位咱也来从头从零开始写一下啊,首先我们看写什么啊,第一个就是。大家注意这个结构中啊,因为咱有一个就是,就是你数据成功失败一个响应码,比如说咱们约定2万是成功,20001是失败,那我现在把这个状态面给他做个抽取,那怎么做呢?我这个课件中的做法就是写一个interface里边定这个固定值啊,咱可以这么做,或者说你写个常量类来定义都是可以的,那我就用这种这种方式做到,或者说呢,大家还有一种方式。这个不知各位是否还记得啊这个东西。
09:00
叫做枚举啊,就用这些呢,咱都能定一些固定值,就是你写个interface,写一个常量类,或者写个枚举都可以做到啊,那我就写一个interface,因为这种方式各位可能之前用的不多啊,咱写interface定义我们的状态码,这是我们要做的第二步,为了咱们后面方便。不定也可以,只是我们要写固定,你再改的话不方便。啊,那我写一下啊,第二步操作。换个颜色啊,第二步。我们的做法就是创建一个interface,然后在里边定义我们那个数据返回的一些状态码。啊,咱来做这个事情,比如说我们现在约定,如果说你成功,那状态就是这个2万,如果说你失败,那状态嘛,比如是这个20001啊,但状态约定不是说一定两万两万零一,看你的实际,我现在就这么约定,2万是成功,20001是失败啊这是我们做的第二步建构interface,然后做到那再来创建一下啊。
10:07
我在里边写一下啊。就是这里边咱们首先还是建一个包,就是一个package,然后起个名字com.a。硅谷点上,比如说叫common。呃,我就叫就叫common u啊,就是这个,然后创建之后呢,在这里边咱们建一个interface。啊,就这个啊,Interface法律创建,然后interface给它起个名字,因为它表示是你返回的状态嘛,比如起个名字啊,我就叫这个。Result code,这是返回到状态码,把这个创建,然后创建之后在里边定义两个状态码,一个是2万,一个是20001,啊,这个我就从课件中复制了啊,就是两个固定的值。这个我拿过来啊,2万那就表示已操作成功,然后20001就表示操作失败。
11:03
啊,就写个CI口,然后这个success,这个叫I。这个啊,我们就做到了,这是咱写的里边的第二步。写个interface定义它操作的相关的这个接口。这个啊,完成。所以第二步做到了啊。然后这一步做到之后,下面我们再进入到我们的第三步操作,第三步呢,咱就要具体定义一下,咱们返回那个格式了啊,就是第三步。写到这个位置啊。第三步。我们就具体定一下,返回到数据博士。那怎么定义,给大家梳理过程啊,这过程应该也算是一个比较固定的流程啊,咱们看一遍啊,然后咱们来写,怎么做呢?比如咱们一会儿我定一个类,这个类假如我一会起名就叫R啊,当你给换个名字,然后在R里边,咱就按照我刚才说这几种类型,Success code message date这四个,咱们在类中先定义四个属性,针对你不同类型,比如布尔类型、in特类型、词数类型、map类型。
12:12
然后咱们生成它的get set方法,用logo插件,然后生成之后在里边呢,我们就针对成功和失败解决方法,比如说这个是成功,然后这是失败啊,下面再写它具体设置值的方法,把这个咱给他就写出来。但是这里边呢,我在写的过程中,大家看我的课件中啊,有这么一个写法。这各位不知道是否能看懂这个代码啊,给大家拿过来。大家看这代码,它叫private。这个关键字咱应该认识private是不是私有的,而我这个类叫R,我这么写,那这个类是不是它那个就是构造方法就私有啊,它就私有构造方法,如果说你这个就是构造方法,这是无参的,如果说无参方构造方法私有化的话,那咱们这个类再用的话,你是不是就不能new了,因为它已经私有了,那咱用的话,你看我这里边就专门写两方法,而两方法都是这个了。
13:13
就是SIC是不是静态的,所以咱们为了方便,我把它变成private,就让别人不能new,只能用我这个方法,一个是OK,一个是I着啊,这是我做法,当你不这么写也可以,只是说你这不这么写的话,你这里边可以别人可以随便扭啊,但是我现在这么做,别人不能扭,他只能用我这个方法,因为这已经把构造方法私有化了。啊,就是这么一个写法啊,这一代诗句中也经常会这么来用,那咱下面啊就来把这个代码我们继续来写一下。啊,咱写一下啊。Interface写完了,然后在里边我来创建一个就是统一结果返回这个类名字随便起,比如我就叫R。这个类啊,我给它加个注释,这是我们那个统一返回结果的这个类,然后起完之后在类里边,咱们根据我刚才说的四种类型,咱创建四个属性,就是一个是布尔,一个是int,一个是string,一个是map,把这四个创建出来啊,那这个代码我就不挑了啊,因为这比较简单,就是写四个属性,我把它复制过来。
14:21
这注解是那个swa,那注解啊,不加也可以,第一个success或类型成功,第二个code状态码,第三个message是否成功和失败,最后一个哈希map是你那个具体那个数据啊,所以咱们把这几个都写过来了,然后起完之后在类上边咱们加上一个注解,这个叫date。啊,这咱之前都说过啊,是logb主体,它会生成这些的get set方法啊,这个咱写出来了,然后写完之后咱继续往下来做,按照我们这种思路啊,就下面我这么做啊,我把这个类那个构造方法给他,就是私有一下,给他私有化。
15:02
我来一个private r。给他私有啊,而私有之后呢,如果说别人想要去再用这个类,那这类是不能new的,所以不能new的话,我在这个方法中就写两个就是。静态方法一个是成功的,静态方法一个是失败,就是成功,咱调这个方法失败掉下面这个方法啊,就是一个成功一个失败。把这个写一下啊,那我写第一个,比如咱来一个叫public。Cid口,然后这个让它返回是一个R,因为它是统一结果这个方法名字,比如我就叫OK啊,名字你可以随便起,然后在里边怎么做呢?咱就给他手动返一个值。但值怎么返回,大家注意啊,因为我现在是在我自己的类里边做操作,所以我自己肯定是可以new的,但别人是扭不了的,那我就扭上一个R,然后咱像R里边把那个值做个设置,比如说第一个。
16:04
Success啊,成功嘛,肯定是处,这是第一个啊,就是咱们里边的第一个值成功,因为这是OK成功方法,然后第二个值我们叫code code的状态嘛,应该是这个2万,但是2万呢,咱刚才是写到这个interface中,我用interface直接掉下在里边,这个叫success,这叫2万啊,就是咱们直接用这个。静态的常量2万,然后除了他之外,还有一个是这个叫message,就是它那个信息信息,比如我叫成功。啊,当然还有一个叫date date咱们不在这里设置,一会儿专门来设置啊,这里边我先退一个R,所以这就是一个成功方法,就是它是一个静态的,所以咱通过类名可以调到。这是一个啊,然后有它之后还有一个失败方法,跟他应该一样,我用这个快速改一下啊,这名字,比如我叫A啊,然后这个叫false。
17:05
这里边的值不是那个size,是这个挨着变为零一,然后这个我们调。失败。啊,这个啊,咱就写了两个方法,一个是成功,一个失败,而两方法希望各位能看清楚啊。咱们的这个类叫R,而这个类我已经做了构造方法私有化,所以说你想用这个类中的方法,咱要写静态的话,是不是能用,就你R点上这个方法名字,那这方法是不能使用,因为它是静态方法。啊,这是咱们写的这么一个方法,然后写完之后呢,我这些数据中呢,咱会发现它是没有这个date啊,没有这个数据,所以咱们把其他数据做个设置,那怎么设置给大家说一下啊,我这里边有段代码,就是代码写都一样啊,我就不挑遍了,把这个直接复制了啊,各位写的话直接复制过来也可以,但是你能看懂啊,那我给大家复制过来,咱来解释一下什么意思啊,因为代码都是重复的,我不再浪费这个时间挑一遍啊,咱看一下啊。
18:07
首先大家看。这些方法中做的事情是不是都去调这个set放往里面放纸,比如说这是success,这是message,这是code,包括这个也放,因为它是map即可再用put,或者直接设置个map,都往里面放纸啊,这是专门设置方法。但是大家会发现啊,这几个方法中,你看最终都通了一个东西,叫这个this。就是都这个this。好,那这里我想问一下各位啊,希望各位给我一个回复,你说这里边这个是什么意思,这this代表什么?我希望各位啊,给我一个回答,This代表什么?觉得这个各位应该知道啊,应该是咱们Java基础阶段学到的。This是什么?
19:00
这里边啊,我这里特别说一下啊,首先啊,大家看啊,我当前这个类是不是有对象了,This你可以理解为啊,就是我当前类的这个对象,咱return this就是我这个对象啊同学说的就是R这个对象没有错啊,就是代表它谁调谁那就代表谁啊大概是这个意思啊,就是this,那我这么写什么意思呢?给大家强调啊,因为现在我这个方法就这个类已经做了私有化,那别人如果说想掉的话,他肯定不能直接扭,只能用我里边的方法。那里面方法中也就说不能别人不能用,对象那边要用怎么用,我把每个方法中都re this,就是把这对象给它返回,那他可以用,而这么写的目的也是为了做到一个操作,这操作不知道各位是否听过啊,我写一下。他要这个操作。叫做链式边程。这个不知道各位是否听过啊,什么叫链式偏程呢?比如说啊,咱一会儿要用的话,那我肯定写一个r.OK。
20:03
然后怎么做,我再点上一个,比如叫code啊,然后我再上一个,比如叫message。包括再点上加方法,你注意一个写法是不是都是点上点上点一个方法,这种写法就叫列式编程,因为咱们这些方法中最终是不是都是蕊同的Dis,所以它就能写出这种链式变成效果啊,用这个咱一会儿给它使用出来,所以这时候我们写的一个统一返回结果一个类,这个类我们就叫R啊,然后里边是这个代码。啊,这个各位给他知道啊,而这个代码应该说是一段比较固定的代码啊,就是各位写的时候,第一次你给他写一下,然后后面比如说以后你再用的话,给他直接复制可以了啊,我截过来一部分啊,然后最后说一遍啊写法就是第一个根据我们的返回结果,先定义对应的四个属性,生成get德赛的方法,然后定义之后咱把这个类给它构造私有化,对外提供一个成功一个失败方法,包括其他值设置,咱都用这个return this,让其他人可以调到啊,它return this就是当前这个对象。
21:11
啊,这是我们做到的,而咱这么写你是为了后面方便用那个叫链式编程,就是你一直在点这些方法都可以调到。啊,所以这个类我们就最终做到了啊,就是这么一个结构啊。咱们把它完成了,这是我们说的第三步啊。啊,这个代码我只截过来一部分啊,然后其他的你到我的课件中找到。加个省略号啊,就一部分。然后这个写完之后,咱现在把这个统一结果,这个代码应该基本上就已经完成了,但是完成之后呢,咱最终目的这是不是要用一下呀,咱不是只是写最终还要用,那用怎么用呢?咱肯定要在我们的接口中使用,也就说我们要在这里边进行使用啊,那怎么用,我先说一下啊,然后一会儿咱来用一下,首先你看啊。
22:03
我上午写这两个方法,第一个返回叫list。第二个返回是不是叫布尔类型,但是他刚才说的,我们把结果要统一,所以咱们要返回的话,咱们以后再起接口都统一返回一个类型,不是例子,不是布尔都反什么。都返回它就这个R啊,就这位置你写个R,这里边写个R,把R给它返回,比如这位置我们写一个R。包括这里边也写一个R啊,咱们后面都是这么来做,这叫同一结果,让你所有结构方法都去返回这个R啊,这是我们要用的方式。啊,这是我说到的啊。
我来说两句