上个视频分享了前端路由权限管理,还有很多同学表示不懂,我们来看一下这个流程图。打开页面的时候,首先判断是否登录,未登录则跳转到登录页面,登录成功,拿到 token 后,拿着 token 获取权限菜单列表,打开我们的页面来看看效果。 第一步先调用的是登录接口,第二步是获取权限菜单,权限菜单有几个关键的店,可以看到现在权限菜单是异为数组,数组元素有几个自断 id, everyonetid name。 其实这里把前端的路由表给后端进行管理了,因为前端存在路由嵌套的问题,供每一个路由配置给出当前的 id 和副 id, 这样子前端拿到一维的数组的时候,就可以生成一个有路由嵌套的路由表了。顶层的路由 id 未 一后面会用到。我们现在从代码的角度来聊一聊这个是怎么做的,一般我们放在一个 permission just 中处理,这里是调用接口返回一个路由表,使用 router add de roots 动态注册路由。 router add de roots a p i 已经废弃, 新版使用 add root 和 four 循环替代。我们切换到 v x 中的 app g s 模块 get info 方法, get info 是获取全线菜单和生成路由表。路由表是由前端生成的,有一个 component 字段, 这个字段是路由对应的页面,我们拿到后端接口数据后生成路由表,要在本地把这个字段加上。在这里用到了我们开始介绍的负一 id 了。我们从一个一维数组生成一个路由表数需要知道一个跟结点,那么这个负一就是跟结点了,现在来看看生成 成路由表的方法。 create roots 这是一个地规方法,传入一个副 id 和元素组,找到拥有此副 id 的所有子元素,根据 name 字段匹配本地定义。好的 i think roots map 路由页面印设表,最终这个方法会返回当前用户仅有的权限的路由表, 也就实现了我们的效果。当然这是我的实现方案,欢迎在评论区说出你的解决方案,一起交流学习,希望这个视频对你有帮助。
粉丝9094获赞9.3万

前端如何编程实现向后端交互呢? vivo 语言是可以这么实现,分两个文件,一个是 vivo 后缀文件,负责页面展示及新增修改删除等交互操作。另一个是 js 后缀文件,负责定义交互接口, 其包括 er, messi 的及 parents 等参数 l 即 messi 的须根 java 的 controller 定义一致,这样就实现了前端吊用后端接口了。

让我看看还有谁不了解前端登录流程,会的不会的都跟着瑞塔再过一遍通用流程,可能不同的项目在技术上会有些许差异,但是大多大同小异啦。 第一,我们在登录页点击登录的时候,前端会带着用户名和密码去调用后端的登录接口。第二,后端收到请求会去验证用户名和密码,如果验证失败,会返回错误信息,前端提示相应的错误信息即可。 如果验证成功,后端就会给前端返回一个 token。 第三,前端拿到 token 后,将这个 token 存储到 you 叉和 local story 之中,并跳转页面,即登录成功。第四,前端每一次跳转到需要具备登录状态的页面时, 都需要判断当前托肯是否存在,不存在则跳转到登录页,存在则正常跳转。通常我们把这个逻辑封装在陆游守卫中,另外再向后端发送其他请求时,需要在请求头中戴上托肯。项目中,我们把这块的逻辑封装在请求拦截其中后, 判断请求头中有无 tok, 有则验证该 tok, 验证成功,就会正常的给我们返回数据。如果验证失败,比如 tok 已经过期了,那么就会返回相应的错误码。前端拿到错误码信息,清除 tok 并回退至登录页。以上就是一个通用的登录流程,看到这里的小伙伴对大体流程应该是有概念了吧,关注瑞塔,每天进步一点点!

同学们是调试 api 接口的非常方便的有利工具之一,现在演示通过 http 跟 htvs 去调试一个 api 接口,把地址放在这里,这里选择一个 方法,一般都是选透视玻璃,这里选 iw 格式,然后再选择 j 损,然后把 j 损参数内容填在这个位置,这点发送 啊,调用完成之后,这个状态两百就是调用成功,这个是耗时,这个是返回的大小,返回内容就在这里。 再再调用一个 h t t b s 的一样,把 a b i 地址放在这里,这里选,也选择 pose body 也是同样选择 iw, 选这一审格式,把这一审内容填在这里,点击发送,这时候就会报错,我们看一下这个报错信息,是证书已经过期了,我们可以设置,跳过证书验证,再设置这里把这个去掉, 然后再点发送去调用,这时候就可以调用成功了,调用成功,这里状态也是否有两百,一样的法人内容也是在这个。

上传文件,你第一步千万不要去写什么界面啊,组件啊这些玩意儿,这些不重要,上传文件第一步要做的事情必须是调试接口,为什么呀?因为上传文件的本质就是一个 a p p 请求啊, 有一个服务器,然后呢,我们通过一个 app 请求把文件数据给他带过去,不就完成了上传文件了吗?至于说发送这个请求的客户端,他可能是网页,也可能是一个 app, 也可能是小程序,也可能是一个桌面应用,有可能是用户点击的某个东西,有可能是自动上传, 随便,不管你前面这个客户端做了什么样的事情,你最终要完成上传的动作,一定是一个请求过去了,同时把文件数据给他捎带过去了。所以说第一步呢,你一定要拿到你们公司的文件上传接口,他一定有个文档给你,你把这个文档 要好好阅读一下,然后单单的用这个接口去调试一下,看他通不通。如果说这一块都有问题的话,你后边怎么开发都是有问题的。所以说先把这一步搞定,不要写任何代码, 直接发请求。那么什么样的东西可以直接发请求呢?那工具有多了,常用的就是 poseman, a p, f x, 对吧?这些应该是你们接触的比较多的,甚至控制台呢,也可以发请求,比方说 co 命令, w get 命令, 对吧?都可以发请求。那我这里呢,用的是一个 vs code 的插件,叫做 rest client, 你首先呢,到插件市场里边去找到这个插件,然后去安装这个插件的好处啊,它就在于可以让你用一个非常原始的 a t p 请求格式,把请求发出去, 具体怎么用呢?看着啊,到工程里边去。比方说我们要上传这个图片,我们要发一个请求,怎么做呢?新建一个文件, 给它取个名字,名字随便取啊, test 后缀名呢?给它取上 atp。 好,那么在这里呢,就可以编写最原始的请求格式啊,比方随便来一个吧,来发一个 get 请求,怎么发? atp? 写意里边第一个单词就是请求方法是吧?然后呢,写上什么请求路径,比方说跟路径,然后写上请求版本这些没问题吧? 然后写上什么 hot, 对吧?请求主机,主机是什么呢?比方说我们请求路易的官网啊,路易 edu 点 com 就完了呀,请求头请求行,然后呢,发送请求上面的按钮啊,点击一下, 你看服务器的响应结果不就过来了吗?对吧,这就是完成了一个非常简单的请求,而且呢给的是一个最原始的 atp 请求格式,这可以非常好的帮我们去理解这个请求的过程。那我们现在就利用这个工具来发送一个文件,上传的请求怎么发送呢?对,照着这个文档来,他怎么说你就怎么。 首先是请求路径,路径呢是这个,那么你在这里呢,该改一下啊,改成 upload single 啊,路径没问题了。然后是主机呢,主机呢?他会在文档最开始的时候就就会告诉你,一般来说每个公司呢,他会部署一些测试的服务器,那么你把他测试的服务器的主机名填进去就可以了啊,我这里呢是 test, 就靠九五二七。好,请求方法呢?文档里边也告诉你的啊,一般来说呢是 post 好,这里呢写上 post 好 post 请求一定要带一个请求头啊,叫做 content。 他表示说我后边的请求题里边的东西是一个什么样的格式?比方说你用的是接审格式,账号查查密码查查 比方用的这种格式的话,那么这里要写上什么?是不是 i b k 请节省对吧?学过的没问题吧。呃,那么这里呢,上传文件是一个什么样的格式呢?那就不一定了啊,每个公司呢,他有自己的要求,一般来说呢,是这种 格式 the mark part form data 好,于是呢,我们在这里呢,需要把请求格式给它变一下啊, mark part form data 这个格式呢,它会不会附带一个叫做 boundary 表示分割符?这啥意思呢?我们一会儿就知道了啊,先随便写表示一个分割符。好,那么接下来就开始写这个请求题了。请求题咋写呢? 他一定要按照这个格式来写,他现在不是接上格式了,你就不能再这样写了。那怎么写呢?看好了啊,他是这么写的,用两个短横线 加上这个分割符作为一个字段的开始。比方第一个字段账号,那就填到这,当然具体的填法了以后我们再说,反正第一个字段的信息就填到这,然后接下来是第二个字段。 第二个字段的信息呢?比方密码填到这,第三个字段比方通信地址,那么你填到这,懂这意思吧?看到没,这个分割符他就起这么一个作用,当你把所有的字段全部填完之后呢,最后 后你需要用这种格式来结束前面两个横杠,然后加上一个分割符,然后再加上两个横杠,表示整个请求体结束了,这就是这个 marketpart form deta, 它的具体格式就这样子。那具体要写几个字段呢?我这里写了三个,对吧?具体写几个呢?那要看你的接口要求,他不是一定的 学程序,千万不要把他学死啊,他要求几个你就写几个。像我这里的单文件上传呢,就上传一个文件就可以了,因此呢,你只需要写一个字段就可以了啊,把这些全部删掉,那么这里呢,就写一个字段。那么每一个字段具体该怎么写呢?首先呢,写上一个固定的语句, 叫做 content desperation format 固定写法。然后呢,后边写上字段的名字。我举个例子啊,比方说刚才我们写接胜格是咋写的?账号,账号的值,对吧?那么这里的 name 呢,就相当于是这个属性名,或者叫做 键的名字。因此这里该怎么写也要看文档,文档里边要求你自断名称为 avata, 所有的自断名称影响到哪,它就影响到协议里边的这个部分, avata 相当于是一个属性名。好。然后呢,如果说是一个文本自断的话,那就没啥了。比方说这是一个 login id, 那后边直接写上账号的值就行了,只要账号的值是这个,直接写就完事了。 但是由于这个字段是一个上传文件的字段,你后边还要写上一个 fail name, 这个玩意起什么作用呢?它的作用是告诉服务器,这个文件在我本地的名字是啥?服务器呢,可以作为参考。比方说我要上传的这个文件叫 small 点 jpg, 这个文件的名字就是石墨者接脾气啊,你把这个名字给他写上就完事。当然呢,你也可以改成别的名字啊,无所谓的,只不过一般来说呢,我们写的是文件的本地名字。好,与此同时,由于呢,这个字段呢,他是 一个文件数据,所以说呢,我们还会告诉服务器这个文件的类型。注意啊,这里的 content type 和上边这个就不是一个意思,上边这个表达的意思呢,是整个请求题,他是什么样的格式哦,他是用分割符这样一块一块分割的这么一些字段, 这里的 ctrl 表示这个字段下是一个文件。这个文件的类型是啥?那么这里呢,写的是 mat 类型,这学过了是吧,就是用一个字符串来表达某一块数据的类型。这是什么文件?是一个图片什么格式?接 peg 好,那么前面这两段话呢,就描述清楚了啊,我有一个文件本地的名字是这个, 然后呢,他的内存呢?是一张图片,然后是 jpg 的图片。好,写完了这些描述之后,接下来下边这个地方就会写上图片的二禁止数据。我们上传文件,最终就是要把这个文件的二禁止数据给他。 八道服务器放哪的?就是放这的,这就是最原始的上传文件的格式。但是呢,我在这个文本编辑器里边确实没有办法去写什么二进制数据,不是说写个零一就完事了,他会把这玩意当成字符串的。那怎么办呢? 哎,幸好呢,这个插件他可以让我们用一种简易的写法来表达一个二进制。你不知道上传文件吗?那你用这种格式写,这里改上文件的路径, small 接平行。我要重点强调一下啊,这句话是给这个插件看的, 当他发送请求的时候,看到了这么一句话,他会怎么样呢?他会把这个文件的数据给他读出来,然后用他的二进制数据替换掉这个地方, 也就是说, a、 k、 d 的请求最原始的格式下边这里放的一定是二进制哈,他不是这么一个玩意哈。好,准备好了一切之后, 我们就可以发送请求了,来,把请求给他发出去。发送请求收到了服务器的响应结果,服务器告诉我们,图片上传成功了,并且呢,通过这个响应结果 data 来告诉我们,你可以通过后边这个 url 地址来访问到这个图片, 一切都完成了。通过这个过程啊,同学们可以感受的到,原来图片上传并不需要什么按钮,不需要什么样样的各式各样的界面,不需要什么事件,不需要浏览器,不需要小程序,不需要艾特,一个 adtp 就完全搞定了。文件上传,这才是文件上传的本质,你做文件上传的时候,第一步就要去调通这个接口, 当然呢,这个接口里边还告诉你的很多信息,包括允许的后缀名是啥,对吧?如果说你把后缀名给他改了,然后你发送看一下呢?福气告诉我们,后缀名不符合要求,对吧?说明福气读的是哪的?后缀名读的是这里, 你给他写的那个 filing, 这里可以是随便写的啊。哎,有同学说他为什么不读这个呢?我再一次重申啊,到真正发送请求的时候,这一块会被替换成文件的。二、禁止数据哪有后缀名啊?复习读后缀名读的是啥?读的是这个 好,包括呢?还有就是最大尺寸,我这里的图片呢,比较小啊,所以说上传成功了。如果说你上传一个比较大的文件,比方说像这个 hug 点 gpc 啊,是另外一个文件,他就比较大,改一下吧,咱们发送一下服务器,告诉我们文件过大,那么这些呢,都可以通过服务器的程序来进行控制 好,下面呢,是一些响应结果的视力啊,成功了会怎么样?失败了会怎么样?你对照一下看那个接口,文档说的和你真正的试验出来是不是一致的,一致的话说明接口是没问题的,不一致的话去找你的后端开发人员沟通,调通了接口,你就扫清了文 线上传最重要的障碍,然后再去写各种各样的界面,各种各样的交互,那都是后话,也不是什么难事。我们后边呢,会带着大家写一写。

什么是接口?接口主要是指用于外部系统和系统之间,以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来通过一些特殊的规则,也就是协议来进行数据之间的交互。 常用接口类型有哪些?一、有 first 接口,用的 sope 协议,通过 htp 进行传输,那请求豹纹和返回豹纹呢?都是 x 三万合适的,我们在测试的时候呢,可以通过工具进行调用,比如 jimitter, olander, 还有 atipose。 第二是 httb 协议的接头,他是通过路径来实现这样的方法,那请求爆版的一般都是 py 六形式的,返回爆版的一般都是 jc 串, 那 htb 协议呢?有盖上 pos 组成方法,这也是最常用的两种使用方式。那咱们可以使用工具呢?有 app 加 pos 的极品小流装,这来进行测试。接口是什么组成的?接口的组成呢?包括形成的说明。第二个要 还有请求方法,方法具有 get post, 还有 pose, 还有请求参数,请求类型,请求参数说明,还有返回参数的说明。为什么要做接口测试呢?那接口呢?其实是前端和后端交互用的,那所以好多人问,为啥做功能测试,咱还要测接口呢?目标是啥?不是多此一举吗?首先我告诉大家这种想法是错误的, 举一个例子,比如一个登录接口,那产品规定呢?用户名是六到十个字图,那数字或者下方也可以,但是后端呢?没有做判断,那我们的业务人员测试呢,肯定毕业去验证他, 但如果只是前端做了效应,后端压根就没有判断的话,那么后果就来了,如果一个懂行的人直接抓包方便面的接口,那就可以绕过后端的效应,通过搜索输入啊,直接随意登录, 那如果你这是一个下单的业务,是不是就给公司造成很大的损失啊?所以这个时候接口顺序的目标就来了,第一呢是可能发现客户端没有发现的 bug, 这叫隐藏的缺陷。第二呢是可以及早的爆出风险。第三,如果接口稳定的话呢,前端可以随便改。第四最重要的呢是可以检查系统的安全性和稳定性。

啊,大家好,我们这次呢就是来给大家做一个分享啊,就是关呃讲关于这个接口第二晚开播的一个小教程,现在我们会分为大概七个小节来去做分享,大概每一节是五分钟啊,他们呢去做一个碎片化的一个学习, 那么我们来讲第一块啊,做讲讲一个 at 的一个接口的一个入门思域,他都握的一个例子,那么这节课我们主要就是就是 几个关键词啊,就第一个做 a 拍的一个接口开发,第二个呢他是一个低代码的,也是一个比较,就是零基础,然后低代码的一个开发的一个工具跟一个学习,那么我会用到这个工具啊,那么可想去想做一个注册, 然后我们来做一个 hello word, 一个接口视力啊,先写一个 hello word, 一个第一次编程都会写一个 hello word 的接口 入门视力接口教程演示使用啊,然后就可以去做一个保存。那么这个时候呢, 我们的第一个 hallevent 的借口啊,就已经是就已经是穿越好的了,他正在做一个构建,可能要等一会,大概的话,呃 一分钟左右吧,那么这时候呢,我们就已经下了一个接口的,其实是比较简单的,就说我们只要开一个账号,然后在上面去填一个 新型,那么这么这一个接口呢,他就会他就可以出来了啊,然后这时候他已经是真的好了,那我们可以看看这个效果啊, 这个是我们刚刚写的第一个 word 这个接口,那么他这个名称啊,版本号,他的这个接口的请求的这个路径啊,在于哪里? 像这些都可以去去请求了,那么还可以看到他这些参数啊,一些呃返回的这个内容。那么到这里呢,我们的哈喽沃呢?这个这个就已经是写好了,那么我们再稍稍微来看一下这个哈喽沃的接口,他有什么样的一些特点呢? 那么他有些呃正式环境啊,有这个正式环境他可以有有这个名称,有这个说明版本号,也可以对他做一个编辑,因为我们刚刚刚刚 是生产一个基本的接口啊,那么他他写名称啊,路径说明,还有参数啊,跟这些呃与函数,跟这些返回的自动还有结果。那么我们也可以呢对他做一个导出啊,到本地去做一个备份, 到时候还可以对他导导致之后呢,他就是一个呃文件的一个这样的这个文件啊,就是那当哪天你要去给别人用的话,或者是自用的话,也可以再去做一个导入啊,这样就可以去导入这个 这个接口的,那么这一节我们的这个他的卧的话就介绍完了。

那再聊聊第四点,接口超时。那举个例子啊,比如说咱们系统上线之后,那我们调用第三方接口最容易出现的问题,其实就是超时问题啊, 因为我们系统到外部系统之间,它本身就存在一条很复杂的念路的,那中间是不是有有可能会缓解出现问题,那影响了 api 的一个响应时间,对吧?这一点非常尴尬,是什么呢?就是这一点是别人的系统,那我们呢?是控制不了的, 我们跟别人说,那你这个接口响应比较慢,那你可以去优化一下,那首先照样呢也会存在一个问题啊,就是我们反馈之后,那如果说我们是甲方,那可能对方响应还会快一点,那如果对方比我们更有优势,而我们呢是没办法要用人家的,照样 呢就很有可能,比如说你一个需求你提过去,那人家逆向啊,对吧?需求整理啊,然后包括优化呀,然后测试啊、上线啊,那拖个半年都有可能的。那别人呢?他体验的是你的系统, 你速度慢一点,其实能说过去的,但是说你要老是返回失败啊,超时啊,那这一点到用户层面,那用户第一个找的就是你,对吧?所以说咱们作为这个 api 调用方啊,那我们去面对这种情况的时候, 我们除了给他去反馈问题,我们去优化这个接口的性能之外,我们其实更有效的方法是什么?我们要去增加一个从事机制。 就举个例子,比如说,那你调用失败了,对吧?那我就比如说我设定个三次,那我去从事三次,如果说我从事成功了,那 ok 我就返回嘛,那如果从事失败了,那我就直接我再返回,失败 呢会更好一点。好, ok, 聊聊。第五点啊,那偷偷改参数,这一点是非常令人讨厌的,我们和大家举个例子啊,那就是我之前做过的一个项目啊, 我之前我调用某个平台的 a p i 的时候,我可能要去获取一些数据,对吧?那之前那对方的文档提供过来,他状态呢?只有两种, 一个是正常,那还有一个是禁用,然后呢我们把状态更新到我们自己的库的时候,那本身对接的是好好的,那也运行了几个月,那突然有一天,那这个用户反馈说我一条数据明明删掉了,那我为什么在页面上还能查到啊?那这个时候我去看数据库,我发现这个状态没问题啊,但是我去查看这个 api 接口日志的时候,他发现这个指标是什么下架,他突然多了第三个指标了,对吧?所以说这一点呢是很尴尬的啊,他偷偷的把这些参数呢改掉了,然后呢也没有通知我们这, 所以那对于这一点的话,第一个那就是跟他们去沟通解决,就是这个下架状态,他是不是一个非正常的状态,他是不是不应该显示,对吧?那如果说他确定了,那么他们改了数据,那他们确实呢也要告诉我们,那我们呢我们再去调我们的系统, 那还有第二种呢,我们尽量的把这种霉菌类的参数呢给他去做一个动态化,也就是我们去请求一个接口,我们把这些霉菌信息呢先拿过来,那我们去做判断的时候,我们去根据这个霉菌类返回的信息呢,我们再去做演示,这个呢就能很好的去解决问题啊。 ok, 那咱们呢再聊一聊最后一点,那最后一点呢也比较尴尬啊,我不知道大家有没有遇到过啊?就是你在调用第三方的时候,那接口呢是时好时坏的,比如说五分钟之前你还能用,对吧?那过了五分, 然后你会发现这个接口呢五零三了,然后这个接口呢四零四了啊,又过了几分钟,这个接口呢又好了,对吧?这种可能的情况有好几种啊,就比如说可能对方在重启嘛,这个是可能存在的,但一般呢这个都会通知的。那第二个呢,可能他们服务呢是一个集群的,那可能中间挂了一两台, 但是呢他有可能把请求呢也打到那台机器上面去了。那还有最后一种啊,他这台机器呢已经下线掉了,但是呢他并没有去剔除他,那在注册中心当中,那网关呢,他还是会把这些请求呢转发过去。 所以这三种情况呢,都是会导致接口时好时坏的一个情况。那我们作为调用方,我们要解决的问题呢,是我们首先第一个我们要反馈吗?那这个是必须要做的一个流程。那第二个呢,我们要保证咱们系统的一个健壮性的话,我们要尽可能的去 增加这个失败重试机制。那错了一次没关系嘛,我过一会我再试第二次嘛,那这样呢也能够比较好解决,那一般挂了的话,他不会挂太久的,那如果一直挂的话,其实那也没有什么其他的办法,那就只能去沟通了,好吧,好,那这个呢就是今天跟大家聊的六点啊, 那我相信那各位小伙伴在真正的去调用第三方接口的时候,还会遇到一些其他的坑,那大家呢也可以把自己遇到的这些坑呢写在评论区啊,那大家呢一起来聊聊,来去回忆一下之前的伤心往事啊。同时呢我也建议大家去想一下, 就是如果让你去设计一个第三方平台的时候,那你会怎么去设计?那对于我刚刚提出来的这些问题,你又如何去避免?那我们呢也可以在评论区那大家一起去探讨一下。好, ok, 这个呢就是本讲的全部内容了,而笔记呢我已经准备好了,那大家可以去看一下,如果大家有需要这本笔记的话,那可以评论区扣一,然后呢私信我领取。好今天的内容呢,到这就结束了,咱们下期再会。

好, ok, 大家晚上好,然后今天给大家分享一下我们 idea 如何去运行前端 v o e 的一个项目。首先通过我们的一个 idea 去下载它的一个 pluginess, 我们首先进入找到他的一个 plus, 这里我们去搜索 voe, 然后这里我们需要安装 voe, 点击 s 这一个插件,然后点击 install, 然后再点击 upline, 最后点 ok 就可以。安装好了之后,呃,就通过我们的一个, 第二就可以看到它的一个 v o e 和 v f store 模式一样的,然后安装好了之后,同样也要配置我们的一个 note 版本,点击 settings, 我们这里输入 n p m, 找到我们的一个 note 版本,这里我们选择我们本地文件夹,选择对应的一个 note 版本,点击 ok, 然后就可以了。 然后弄好之后我们输入诺德跟威,然后检查一下版本十四点一八,好,然后最后点击我们 npmrondv, 如果啊首先没有安装依赖的话,手就是安运行 npm sdord, 然后可以的话,我们 npmrondv 就可以,但不是所有的都是 npm around dv, 我们要去他的一个 package 点,接着里面这里配置他的一个快手脚本,如果他是呃 server 的话,我们就是 npm around server。 好, ok, 觉得有用的可以帮忙点点赞,点点关注,好,谢谢大家。

哈喽,今天来给大家分享一个小技巧,手写一个动态的份,实现一个万能接口调用,什么意思呢?比如说我本服务如果要调用商品服务的话,我需要写这样的一个接口,在接口上呢需要指定这样的一个注解,指定他的一个名字, 并且呢指定调用的 u i r, 如果说我想要调用 u 的设备四呢,依然是要这样做,但如果说我想要调用很多个服务呢,我可能就需要写多个这样的接口,那代码呢会比较的繁琐, 那我们来看一下如何实现万能的一个粪钓用。那我这边呢有一个 dynamic client 的一个类,把它放在容器中,然后呢我注入了一个 dynamic fin client factory 这样的一个呃对象, 这个工厂呢主要是用来生产我们 dynamic service 这样的对象的,那这个里面有两个方法,一个是 pose 方法,一个是 get 方法,然后我们在 pose 方 方法中呢用 dynamic factory, 然后的一个 get 方法去获得对应的 dynamic service 的类,然后用 dynamic service 去调用我们的方法,然后发起远程调用。 我们来看一下他是怎么获得这样的一个 service 的,他这边呢传入了一个分内幕的参数,然后这个就是我们的远程调用的那个服务的名字,然后呢我们看一下他的这个方法的实现,然后这个里面呢他用分克拉的 build 这个分自带的一个建造者, 然后传入我们的呃一个类型,然后再传入服务的一个 id, 然后呢我们就需要他返回我们对应服务的这样的一个对象, 那我们来看一下打了每个 service 这样的一个接口,这个接口里面呢其实就是定了两个方法,一个是 pos 的方法,一个是 get 方法。那我们来看一下是怎么用的?比如说我在容器中拿到这样的一个对象,然后呢调用他的这样的一个方法, 然后呢传入我们远程服务的一个名字和 uil 以及我们的参数。那这样的话是不是就实现了一个远程调用了呢?我只需要传入不同的服务名,然后 uil 以及我们的参数就可以发起远程调用。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来 这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。

哈喽,今天来给大家分享一下 spring boot 如何保证接口的安全,那如果要确保接口的安全呢?我们一般要在客户端进行加签,然后呢在我们的服务端进行验签, 比如我这边有一段代码逻辑啊,这边呢是一个过滤器,然后呢我这边构建了这样的一个请求头,里面呢有一个 sign, 还有一个时间戳,还有一个随机的字符串,然后我从请求头里面拿到随机字符串设置, 拿到客户端传来的签名密要进行设置,拿到我们客户端传来的时间戳进行一个设置。 我这边呢还加入了时间的验证,判断我们的 timestem 时间戳和当前的时间是否超过六十秒,如果超过六十秒的话就提示签名过期。然后我们客户端呢还会传过来一个随机的字符串,判断一下我们 release 里面有没有,如果没有 的话呢我们就放到我们 reds 中,并且设置我们的失效时间,就是我们的那个六十秒,如果说存在的话呢就是请求重复。当所有的都教研成功之后,我们再根据我们的请求方式,然后呢去进行验签,比如说我们拿到请求的参数,然后呢调用这个方法, 在这个方法里面呢拼接我们的参数,然后去进行验签。我们通过这样的一个方法呢对我们的参数啊进行加签,然后呢再跟我们客户端传过来的一个签名呢进行对比,如果稍等的话呢就验签成功,最终如果验签成功之后呢会返回处,然后呢我们就放行, 然后我们通过 pos 麦来测试一下,现在呢是正常响应的,但是如果我们用同样的参数再访问一下,就会显示重放错误。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢?可以到这来 这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。

好,咱们来看一个 t s 里边非常常见的类型标注问题哈,比方说我们有这么一个接口,定义了一篇文章的数据,然后呢,我们可能需要有一个函数啊,来创建一篇文章 create, 那么这个函数呢,他会有一个参数啊,就是创建文章的一些数据,那么这个参数应该是什么类型呢?毫不疑问,应该是这个啊, t 口是吧?但是呢,如果说你这么写的话,会有一个问题,就是我在创建文章的时候呢,其实有些东西呢,是可以不用写的,比方说文章的作者 不传的话,就相当于是匿名日期,不传的话就是当前日期阅读的数量,不传的话就是零。所以呢,我们在创建文章的时候,这个参数啊,它的类型呢,类似于文章,但是呢,又有一点不一样,你看啊,我下边写了个类型,表示创建文章的选项标题和内容,你必须要告诉我。但是呢,作者啊, 日期呀和阅读数量是可选的,所以呢,应该标注为这个类型,但是呢,你可以明显的看出这两个类型之间产生了关联,一个 有很多重复代码,因为我这个例子还比较简单哈,文章里边其实数据应该是很多的,而且呢,不仅仅是文章,你看很多的其他对象,你在操作 ts 的时候呢,都会遇到类似的情况,那么我希望呢,这个类型啊,能够根据它来演算出来。比方说我希望的是啥呢?我希望的是这个 chris article options, 它就来自于文章的类型。 不过呢,这个文章的类型里边呢,它有一些字段啊,是可选的,比方说像这个 forcer, 还有像这个 date, 还有像这个 recon, 哎, 假设呢,我们有这么一个工具啊,叫做包型头传入两个东西,第一个范型呢,传类型表示文章,第二个范型呢,传的是文章的字段,就前面这个类型的字段,那么他会得到一个新的类型,这个新的类型呢,他就相当于是把这个类型里边你指定的字段,把它变成可选。如, 如果说有这么一个工具的话,数据非常方便啊,不光是这个场景啊,将来很多的场景呢,我们都可能会用到类似的功能,但是很遗憾的是呢, ts 他并没有提供这么一个 工具,那么这工具呢,需要我们自己写,那么你如何来书写这样的工具呢?其实写出来的话,代码很简单啊,就这么一行啊,不行。首先它是一个翻译型啊,有两个东西,一个 t, 一个 k, 对吧?那么 t 和 k 有没有什么约束呢?自然有,你看啊,第二个类型,它表什么意思呢?表示前一个类型的字段,对吧?所以说 k 应该是什么呢?应该是这个 k 啊,它 应该是 t 的一些字段。好,那么这个类型的声明呢,大概这个样子,那么它关键是个类型应该等于啥呢?那我现在这里呢,快速的把它写完,看同学们能不能理解啊,写完了我再解释,它应该是这个,然后 and 滑行啊, 完事了啊,这是个啥玩意啊?不着急哈,我们先来看一下效果能不能实现,那么现在呢,我们用到这个参数,他是这个类型,对吧?这个类型呢,是使用这个 optional 这个工具来取出文章里边这个 author, dates 和 recount, 把这三个属性呢变为可选,然后我们看一下这个 option 式啊, 是不是便可选了? also date 和这个 red call 好,类型标注没问题了。然后呢,在使用这个工具的时候呢,还会有提示,你看会告诉你这些玩意 都可以把它做成科学,懂的意思吧。那么接下来就是要解释这个玩意到底是个啥,所以说你看这些代码呢,写出来是很简单的是吧,但是背后呢,是对基础的扎实掌握,基础越扎实,你解决问题的办法就越多,解决问题的速度呢就越快,同时还可以解锁更多的知识,最终达到的效果才是能做到别人做不到的事情, 只有这样子,薪资才能涨得上去啊。所以记住啊,做别人做不到的事,解决别人解决不了的问题,是成为行业精英的必要条件, 大家都能解决就没啥价值了。这就是为什么我要给你们录制大师课,这课程呢,是完全免费的啊,来领取,完事了,他可以在短短一周的时间里边迅速的提升你的技术视野,不要天天一头扎在搬砖里边去了,抬头看一看外边的世界。整个大师课里边包含的是前端最核心的原理,原码里面是题,效果实现,项目优化等等等等问题, 关键是每一个人都能够听得懂。所以呢,无论你是想高薪就业还是想在职提薪,这个大师课都是你的必修课啊,目前还可以免费领取啊, 怎么理记咱们评论区第一条,然后呢,加入我们的粉丝群,根据提示已经确定完成了。好,我现在要来解释这个玩意了,首先要解释一下这个,这个玩意叫啥呢?叫做 interc, 表示的是交叉类型,啥意思呢?这里个例子啊,比方说有这么一个类型, a 和 b 两个字不串,这个类型 c 和 d 两个字不串。那我要得到一个新的类型,它里边既包含它里边的所有字段,也包含它里边的所有字段,对吧? 我们就使用交叉类型,两个一取一个浅运算。那么得到一个新的类型,这个新的类型呢?它就包含了所有的字段了啊,就这么简单。好,这是这个按的符号, 把这些玩意讲完了,我再一起解释啊,然后接下来是这个 omet, 那么这个玩意是啥意思呢?它表示缺省,非常简单,你看一下吧。这个例子,比方说我有这么一个类型 to do, 然后呢,我使用这个 ormate 传入两个方形啊,一个是 to do, 把这个类型传进去。第二个参数呢,传的是 to do 里边的字段,我要把这两个字段给他扔掉,那么他会得到一个新的类型,这个新的类型呢,他就不再有这两个字段了。所以说你看新的类型用下来的话,他只有这两个,而这两个东西呢,就没了,懂了,意思吧,这是缺省, 然后还有啥呢?还有这个 pick, 这个 pick 是啥意思呢?来看啊,他叫做挑选,还是那个例子啊?比方说有这么一个类型,然后呢,我用 pick 传两个参数啊,一个是类型,然后从这个类型里边挑两个属性啊,挑这两个,那么于是呢,得到一个新的类型,这个新的类型只有这两个属性,其他的没了,你看啊,这个新的类型里边,你看是不是只有这两个属性了,剩下的这个 discreeping 呢?就没了, 可以,是吧?好,那么最后一个,这个 partial 这是啥意思呢?来看,这,这是一个类型,然后呢,我们使用 partial 表示部分,所以说这个英语啊,他不是我们学技术的必要条件,但是呢,英语比较好的话,学东西呢,是会快一些, 表示的是部分把这个类型给他,那么他会把这个类型里边的所有字段全部变成可选啊,就说你将来得到这个新的类型,你在用的时候呢,你可以只用他其中一个字段,两个字段,对吧?用他一部分字段就可以了,因为他的所有 四段全部是可选的啊,你看土豆,你看这些属性是不是全部是可选的,对吧?好了,我们现在知道了这些基础知识之后呢,我们再来看我们刚才的写法,看到 能理解的啊,我要实现的目标是啥呢?告诉他,类型里边有一些字段,要把这些字段变成可选。那你看哈,我,首先这一部分,我把这个 t 和 k 传进去。 omate 啥意思?表示去掉是吧?那么这样子一来,是不是把我传递的这些东西就去掉了?你看啊,我 这里传的是一个 also, date 和 recont, 经过它是不是就去掉了这三个东西,然后呢?只保留了抬头, content 是不?只保留了这个?好,这是这一部分所起的作用,然后再看这一部分, 把 t 和 k 传进去,通过这个 pick, 我是不是只拿到你传的这三个字段,对吧?所以说通过这个 pick 呢,它的作用是啥呢?就拿到这么一个类型, also 和 record, 对吧?好,你看啊,就是这个 pick 说拿到了类型,然后把这个类型呢又放到了这个 party 的翻译型里边。 party 什么意思?把每一个字段变成可选,那你看这样子是不是把这三个字段就变成了可选,对吧?然后干嘛把这个和这个来求一个交叉类型,哎,这个一求交叉一合并,是不是又变成了我们想要的样子?抬头, 碧田、康天子,碧田,然后后边三个呢?就是科学,哎,我们想要的不就这样吗?好,这就是我们得到的最终结果。所以听完了过后觉得他难吗?不难啊,你只要能够把基础掌握好,然后呢,有一定的开发能力,你都能想到用这种方式来做啊。不过呢,他的说法还有很多哈,他还不光是这一种写法,这种写法呢是比较简单的啊。

定义好接口以后我们接下来要做的就是实线接口,实线接口,实线接口的语法呢?在这里, 语法在这个位置啊,好,拿过来啊,往里面列一下啊,就是语法在这里,就是说这个是我的修饰符类类名。好,如果你有继承的话继承这样写 继承这样写好,我的实线接口应该放在继承的哪里后面。那没什么,如果你有继承这样写你的继承如果你没有继承你就可以不用写啊。好,如果你继承的话,写完继承以后实现接口的代码必须写在继承之后必须写在继承之后啊,这个需要注意,然后我们看下后面的语法接口。我可以干嘛? 多个实现多个实现。哎,就说你除了实现这一个借口以外我还可以实现第二个借口啊,比如说再来一个啊,再来一个借口。注意啊,我们以后新建借口可以。怎么新建呢?这里是不是有个一圈 face, 看到了吗?对不对?直接点他就好了啊。好,这个是什么借口呢?这个小哥名字啊,叫俄罗斯的约 usb to 吧。啊, usb 二。好啊,这个是这个这个是另外一个借口。好,然后我再给一个方法啊再给一个方法啊, maxi 的 maxi maxi 的兔啊 maxi 的兔啊。懒得想名字了啊,就简单表示一个抽象方法。好,然后我这个接口呢?他除了可以实现这个接口以外还可以实现 usb 二这个借口, 然后到那什么,然后你看他是又搞错了,原因是因为他是不是还要再重写约是第二里面的方法,然后想明白了吗?啊,这个在程序世界上讲过来讲就有点类似什么呢?有点类似于你当前这个借口啊,既符合约是第一的规范,又符合约是第二的规范, 理解吗?对吧?啊?就大概这个意思啊啊大概这个意思啊。总之你实现了多少接口?你把这个接口里面的抽象方法全部都要实现啊全部都要实现啊,所有方法全部都要实现好,可不可以不实现呢? 可不可以?如果不实现的话这样行不行?大声点,可不可以?是不是可以? 除非你当前这个类是抽象类,那么接口里面的抽象方法就可以不用实现啊。没什么啊,跟那个类是一样的吧啊跟那个抽象类是一样的啊。啊。因此我们就不要把借口想的太复杂了啊。他就是一个特殊的抽象类啊他就是一个特殊的抽象类啊。唯一的区别就是他里面只能是抽象方法啊,但是类里面呢他他可以有自己的实现抽象类里面可以有自己的实现啊。 好,然后这个就是一个接口的。呃,接口的定义还有一个接口的实线的接口的实线啊,在这里来接下来我们看一下啊。接口的继承 接口的继承。接口和接口之间本身呢他是不能实现的,这里需要注意。比如说我这里有一个接口 usb, 那么我这里有个接口约是 b 二,那么我这里干嘛呢?你接口和接口之间本身是继承的关系,你就说应该用这种方式去继承 usb 二 用这种方式去继承月是第二,然后这就表示约是第二的抽象方法是不是继承过来?嗯,并且然后我这个实现呢,我只要 直线 usb 一就可以了。然后 usb 一里面是不是自带的这个这个方法那是什么啊?是从 usb 二里面继承过来的啊是从 usb 二里面继承过来的啊。一样的。好好。然后接下来还有一点需要注意,就什么呢?接口可以多继承接口可以多继承就是假设我再来一个月是 b 三啊, usb 三啊,同样的也是一个接口啊,也是一个接口,我试一下 usb 可以实现可以继承 usb 二同样的也可以也可以继承 usb 三。 你看这种语法没有错啊这种语法没有错好。那么有些同学可能就觉得奇怪说比如说佳娃是点击成吗?这样看看上去好像佳娃不是点击成的。这不是的啊,他这个啊接口虽然用的是是虽然用的是继承的这个关键字但是我们仍然说这个接口实现了这个接口。 那什么仍然是用实现的表示去表示的,但他只是用的是继承的关键字而已啊。因此呢我们这里需要注意些什么呢?就是,呃,加网。仍然我们说他是一门点继承的语言啊仍然是一门点继承的语言,但是接口和接口之间还是可以多这种多继承的。 这种区别我们要知道啊区别我们要知道啊。这个观念在这里你看一个接口是不是可以继承多个接口。看到了啊,一个接口可以继承多个接口啊就因此我们这里需要啊把接口的特点再列一下啊啊就是什么呢?一个类啊啊接口接口的意义接口的意义在于让其他类实现 啊,再约上其他的类实现啊啊一个类可以实现多个接口啊一个类可以实现多个接口啊?好,然后第五接口和接口之间啊。啊可以啊,可以互相继承啊可以互相 继承而且可以多继承啊而且可以多继承,这个我们需要注意啊。好,第六是什么呢?一个类如果啊,一个类如果继承了一个负类啊,并且实现并且 实现了一个接口啊。折折什么呢?折,继承必须写在实现前面必须写在实现前面。什么意思呢?就这个意思,就是我当前这个类如果找到这里啊我当前这个类如果还有继承别的类 如果还有继承别的类啊,这是 a 对吧?啊那么语法就应该这么写,就是我这个类继承了 a 类实现了这个借口,等等是吧啊语法必须这么写啊,就大概这个意思啊,给你们列出来就好啊就大概啊,就大概这个意思啊。啊 好,然后接下来我们来稍微看一眼啊,我当前的这个我当前的这个我当前的这个实现类实现了 usb 接口,那么呢我们就可以干嘛呢?就可以把这个接口啊看成一个特殊的负累啊看成一个特殊的负累多肽仍然是可以运行的,有什么意思呢?看好 usb u 等于等于六一个 usbm 片,这个语法是完全合法的, 你看啊,他他本身来讲是一个接口吧,你就说现在这个现在这个创建对象的,否则变什么样子呢?变这个样子啊,接口接口明对吧啊?变量明啊变量明等于又一个实线类啊。实线类 理解吗?他这个其实也是多态,就相信什么呢?子类的对象赋给了负累的变量是不是这意思我们的接口是不是可以看成一个特殊的负累能够理解吗?哈喽 啊 ok 吧,我们就把接口干嘛呢看成一个特殊的负累就好了就是子类的对象直接付给了负累的电量啊直接付给了负累的电量这个和那个多肽是一样的啊这个和那个多肽是一样的啊 好,第六啊第一啊第七对吧。这边写上啊这什么呢子类啊就是接口啊接口可以啊看成一个特殊的负累啊可以看成一个特殊的负累啊然后是可以干嘛呢啊仍然仍然可以多肽多肽用多肽啊用多肽创建对象 啊仍然可以用多肽创一个像比如说像这个样子啊啊也就接口名变量名等于六一个数线类啊这是完全可以啊就是多肽的话在用普通类的话多肽是这样子的负类啊负类啊负类类型啊然后变量名等于六一个子类 是这意思啊啊这个是我们原来讲的动态对吧啊负累电量名等于六一个子类是不是这样子的啊那么到从接口角度来看的话接口本身是一个特殊类啊只有接口本身是一个特殊的负类那么接口电量名等于六一个实现类对吧一样的啊好啊那么因此呢这种接口呢我们就把当成负类来看就行啊当成负类来看就行 也就说接口换换一个角度来看的话也就说他弥补了佳瓦的不能多继承的这么一个呃小遗憾啊小遗憾因为接口他是可以多实现的啊啊佳瓦当中不能多继承但是还可以多实现啊,就相当于弥补了这种佳瓦当中没有多继承的这么一个遗憾啊。好,接口的一般相关的,呃,就介绍到这里,对, 然后需要需要注意一点的啊,基本上就就就就在这个地方来,接下来我们稍微看一眼啊,接口和抽象类,我把你们同学搞不清楚,就是什么时候用接口什么时候用抽象类,我们这里面可以简单的列一下,就是什么呢?接口 和抽象类的区别啊接口和抽象类的区别啊,我们因为我们可以看到接口里面是不是全部都是什么?是不是全部都是抽象方法对不对啊?他就和抽象类有点像啊,他就和抽象类有点像,那么我们来看一下啊,接口和抽象类的区别在哪里? 首先我们来练一下他们的相同点。相同点是什么呢?抽象类和接口都不能被实力化对不对啊?都不能被实力化主要的意义在于让其他的类继承。然后接口是什么 线啊?接口是实线好,然后接口抽象类呢?和接口都可以包含抽象方法,子类都必须要实现这些抽象方法,除非子类也是抽象类啊,除非子类也是抽象类啊,这是他们的相同点。好,他们的不同点我们, 呃呃,记住下就是抽象类呢,可以有够有普通方法,但是但是接口只能有构造方法,对吧?这是他们一个最大的不同。就抽象类可以有很多普通的方法也啊,也可以有很多的那个抽象方法,但是接口只能全部是抽象方法可以理解吧。就接口他完全是一个规范,自己是不能够实现任何功能的啊,自己是不能够实现任何功能的,但是抽象类呢?多多少少自己还能实现一些功能, 自己还能实现些功能。好,然后抽象类可以有构造方法,接口没有构造方法,对吧?我们刚刚讲了,接口只有两部分组成,呃,产量和抽量方法啊,当然还有第三部分,在第三部分我们暂时可以不用管他啊。啊,所以说接口,接口的成员就是这两个啊,就这两个。 好啊,这个接口和抽象类的区别啊,我们就介绍一下,然后这里面稍微提一下啊,什么时候用抽象类,什么时候用接口啊?其实大多数情况下我们都应该选择用接口来设计我们的程序啊,为什么呢?因为接口他有一个多技巧的原因啊,原则啊,可以让我们设计程序的时候更为方便啊,更为方便啊,当然具体用什么还是凭经验 来看啊,还是凭经验来看啊。好啊,这个接口啊,具体怎么用还是要到后面做相的时候慢慢的来,来,那个就是熟练啊,慢慢来熟练, 然后接下来的话我们来做一下,那个就是学生管理系统啊,刚好把今天学到的知识都来用一下啊,把今天学到的知识都来用一下,好啊,这个概念先。

你这 pose man 咋长得跟我用的那个不一样呀?我这不是 pose man, 但是的确跟你很像,我这叫 api pose 是我新发现的一个工具,你看你可以看一下它这个界面的确给你的,你看颜色啊什么的啊,包括它这个界面功能,你看这只是一创建一个 pose 的球球,对不对 啊?我这里是这个请求参数啊,点击发送按钮,同样跟 pos 曼一样,会有响应的数据,对不对?响应的数据,但是这个比 pos 曼强大的是一个点,是吗?你看这里可以管理这个接口的目录,对,不同目录底下创建不同的接口,你明白吗?这是一个点啊,还有一个点他有个团队协作的功能, 其实你你现在也是测试,在公司就要开发流程当中,你看后端人员提供接口,对吧?提供接口文档给前端,前端开发,前端开发上,然后测 测试,你测试的时候也是验证结果了,对不对?所以说这个需要咱们三同一个协作,那就这个团队里边,我创建一个项目, 咱们三方都在里边,他后端比如说要调整接口,他在那边去改的时候,哎,你我咱们同步就可以在这边看到这个动态的修改的过程, 不存在说因为他改了,我不知道这个更新的这个东西啊,还有一个点啊,我觉得特别好,就是他还可以一键生成文档,你看 这有个分享按钮,点击分享按钮的时候,他会生成外网链接跟内网链接,来复制下这个外外网链接,复制外网链接发一下,你看他就把我刚才 刚才演示在那里边创建的所有的接口,就会生成这么一个,你看接口文档,这直接像个网站一样,这么一个接口文档,你看这个接口文档里边基本的接口请求 参数,请求参数享用的参数的自带描述,非常详细。我觉得这个这个功能就特别好了啊, 帮助服务端的小伙伴就减胜了,比那个我们平常用那个死歪一个就清晰多了好多了。还有个是你,你测试用的,你看他有个流程测试,你应该知道吧?嗯啊, 你看就是刚才你在那边创业的接口,比如说你登录接口,登录完以后你才能用新闻列表,对吧?所以说你把它两个加进来,然后点击开始测试,你看他会先请求登录接口,登录接口请求完了后,他会自动的给这个新闻接口去带上 tok 啊,带上 tok, 然后 这个结果请求冲冠,那足以说明他两个的关联关系是正确的。所以我觉得这个你们这个,呃,做这种流程测试的时候会很好很多,你知道。

我们今天就来讲一下如何通过实现 request board advice 这个接口达到以下目的。在 control advice 中呢,实现打印 post 请求的 uil 和入口。方法。在 control advice 中呢,实现打印 post 请求的 request body 中的入餐, 我们来看一下效果,那我这边写了一个收入 name 这么一个请求,我们用 postman 来调用一下这个请求,看看会打印出什么东西来。好,我这边输入陈轩一棵树作为入餐,调用一下这个请求。好,可以看到返回,这就是我是中国人,我的名字是陈轩一棵树。那在我们的控制台呢,输出这么几个 首先请求的 uil, 然后输出请求的入口就是这个方法。最后呢,输出请求的入餐, ok, 我们来看一下具体实现。那首先是这个返回值里面的这个我的名字,这句话,这句话的话其实就是我们之前视频中也提到的,就我这边只是一个字串拼接,没有什么其他东西,那重点是买 ctrl x 这个类,那在这个类里面呢, 有那么几个点要注意。首先我们实现了这个 quest body 的 ys 这个接口,那这个接口呢?有四个方法是需要我们重写的。那首先这个 support 方法, 那这个 support 方法呢?就是根据注解来说,它就是首先调用的,去决定我这个 interceptor 是否会被启用,那我们这边返回处就表示我这个 interrupter 是需要被启用的。 那接下来三个方法就分别是 before body read, 就我在读这个 body 内容之前要做什么事情,那第二个就是 after body read, 就我在读完这个 body 以后要做什么事情,那第三个的话就是 handle empty body, 就是我这个 body 为空的时候要做的一些事情。 那这边还要注意的是,我们这边是加 request ctrl x 这个注解的,然后我们再来具体看下这个方法。呃,刚才我们的 u i l 打印和请求入口打印,就是在这个 before both read 里面打印的,那具体的东西就是其实我是先获取了注解里面的 value, 然后把这个 value 打印出来了,然后再获取了这个 parameter 这个 executable 就它执行体,然后就把这个具体执行方法给打印出来了,然后就是做这个 afterboard read 这个方法里面动作,也就是这里有我们打印出来的请求参数,就这个 body 里面东西嘛,这边需要注意的是,我这里的 body 是依赖于前面这个 request body 注解的,就是我们这边的 request body 注解,如果你没这个注解,那这些重写的方法是都不会进来的。那最后一个呢,就是很多 mt body, 就是你 body 里面什么都没有的时候,他会跑到这个里面来进行一个对应的输出。好的,我们总结一下,首先我是在这个 ctrl 请求里面用了 request body 这个注解, 然后去自己实现了一个 cross body ys 这个接口,然后将里面的对应方法进行重写,同时呢这个时间类上面要加上有 cross ctrl 这个注解。最后呢就实现我们刚才看到的有一个请求进来会打印他的 url 入口以及对应的参数,那这一面你也可以根据自己的需求去做些其他事情, 只不过他切入点就是在包队读取前和读取后。好的,本期的视频就到这里,欢迎大家点赞、关注、收藏、留言,后期不迷路,让微信进步!

不知道大家有没有这样困惑,我们在用 ps 的时候定义类型,我们可以使用 type 定义,也可以使用 interface, 那具体应该用哪个?怎么样去选择?给大家探讨一下。这个,这个是 reality 记录站的一个项目,基本上都会有这样的目录,这个 a p i 定义这个项目当中所有的公共的接口。那么我们的做法就是在这个地方,我们会使用英的 face 去定义,因为用英的 face 去定义的时候,这个是方便接口继承,这样允许使用通过声明合并方式来扩展他们。比如说我现在这个地方 interface 定义了一个这个类型,然后我也可以继续定义他,那么这样定义完了之后,也就是说在原来的这个技术之上,他又加了这个卡拉这个属性, 但是你反过来他就不行。比如说我这地方改成 tap, 如果用 tap 连续定义两个,这样其实是不允许的。一般呢我们的做法是在这个公用的这个模块里面, 用您的 face 去定义这个类型,那么 type 什么时候用呢?比如说我们定义了自己的组件,这个是定义组件内部的属性和状态,可以使用 type, 因为这个 type 只有这个组件 内部公用,他不被其他的主见使用。可以在这里面去定义这个太普。一般的情况下,比如说我们这个太普也适合这种联合类型。对,比如说我在这地方定义一个太普, 它对联合类型是很有用的。而 interface 更适合声明字典类型,更适合,可以 重新定义,也可以去扩展他。这目前是我们团队的一个用法,但你也可以都同时使用,你的 face 也没毛病。相对来说,踏一步更加严格,他的约束性更强。大家有什么问题可以评论区留言。