00:00
好,我们来处理一下最后的作业,那们希望呢,以参数的方式完成内容协商,那们这一块format传什么,给我们给什么,那我们传插给我们返回插二数据传杰森,返回杰森,那问题来了,我们现在要返回自定义的数据们硅谷那个协议这一块传什么?假设呢?我想要传基G,那就给我们,我返回我们硅谷协议的数据,那我怎么完成这个事情,那我们可以先来到我们这个返回阶层这一块,我们以debug的方式启动起来,把它的这个源码的核心位置我们再来回顾一下,因为在内容协商里边呢,有一个关键性的环节,就是他先要确定我们这个浏览器能接收什么样类型的数据,它这个确确定呢,我们之前说了两种确定方式,第一种确定方式就是基于我们请求参数,你format带什么,我们就确定什么,第二种是基于你请求的请求头header的accept字段带什么,所以我们现在呢,相当于是要基于我们这个请求头字段来,而不是请求头是我们参数字段,我来回。
01:00
回设,那我们参数字段呢,我们来走到我们的这个内容协商的这一块,我们来可以来看一下,好,整个呢,处理完我们开始要进行内容协商,那内容协商呢,一进来首先获取我们浏览器能接收的内容类型,Step into1进来它呢是使用content content我们的内容的negotiation manager内容协商管理器来帮我们来进行解析的。内容协商管理器里边呢,大家看会有两个策略,一个呢是基于参数的,一个呢是基于咱们这个请求头的,但是参数呢,它在这只支持了两种类型,一种是插麦对应application不离插麦,一种是呢,杰S对应杰S,所以呢,导致我们浏览器只能传format等于或者format等于JS,所以呢,我们现在如果进来解析,我们来step度进来,再来重新出去,再来step into进来,用到我们的第一种策略是基于参数的,基于参数的这种策略以后呢,它给我们来解析,解析出什么样子的。
02:00
因为我们现在呢,是基于参数的,它获取到我们这个参数的这个类型,那是我们这个奥杰S,因为我们现在呢传的是布里克杰S,但如果我们此时把它变为我们所谓的基金,那就获取不来了,所以呢,我们想要让它获取能获取来相当于我们的这个参数,基于参数的这个内容商策略里边就得支持,不只是这两种,我们来看一下啊,基于参数的这个内容协商策略默认呢只是这两种,我们把这两种给大家打开。这两种对应的媒体类型是这样子的啊,我把这个呢默认放到这儿,那我们现在呢,想要实现我们的这个浏览器,哎,我们还能兼容我们自定义的啊这个参数值,那怎么办?我现在呢,只需要做一件事就是那我就不妨把我们的这个内容协商管理器里边的内容协商策略我们给它换一下,所以呢,当我们想要自定一些内容协商策略的时候,我们相当就要自定义内容协商管理器,因为在这个管理器里边是来我们来看啊叫content negotiation manager,在这里边呢,是利用内容协商这些策略,这个策略点进来,这是我们的这个策略,而这个策略呢,初始化的时候给我们已经啊添加进去了,我们这一有一堆的策略,所以呢,我们现在就要修改这个策略,那怎么修改这个策略呢?我们看到默认呢,添加只是一个header啊,当我们开启了我们的这个参数的配置,开启了这个参数配置也会给我们添加基于参数的,那这些呢都。
03:34
不能满足我们的要求,因为它添加的这个基于参数的这个协商管理,它的这一块呢,它只能兼容插麦和杰S这两个参数值,所以呢,我们现在可以继续来到web con,那还是来自定义spring mvc,自定义MVC呢,我们都是给容器中放一个web mvc con,其中呢就有一个叫content content negotiation,翻译过来呢,就叫配置我们这个内容协商功能,所以我不妨就来使用它,那我们现在呢,就来重写一下它的这个con content negotiation方法,然后呢,在这个方法里边,它有一个con con里边呢点,哎,我们发现在这里边有一个strateg,相当于我们自己可以设置内容协商策略,对吧?所以呢,那我就不妨点进来,好,那这个内容协商策略里边呢,我们接下来默认呢,系统有两个,一个是参数的,一个是我们这个请求投的,那现在呢,我就加入上我。
04:34
我们自己的好,我现在加入一个我们也是用参数的这个内容协商策略primeter,我们来看一下啊,参数的这个内容协商策略叫private content negotiation,我们的strategy啊parameter content,我们的这个negotiation,咱们这个strategy,好,那就是它我们把它呢导进来,但是呢,我们发现把它点进来以后呢,它有参构造器里边得传一个map,这个map呢是死string类型的media type把这个拿过来,这一块呢非常重要,因为如果我们是以参数的方式,我相当于就要确定参数给我带来的这个杰森,它是映射为applicationlic杰森插麦是application插麦啊,我们的基金是我们的application X硅谷,所以呢,我们相当于就要在这里一开始就要传入我们支持的这些媒体类型,我们这个参数策略支持的媒体类型等于你有一个哈希曼,那好,我们不妨把这个呢放到这,放到这。
05:34
然后呢,最终我们把我们的这个内容协商管理器,这呢是我们这个内容写上管理器strat,然后呢,因为它strateg里边要传一个list,那我们不妨把这个list去构造进来,构造进来我们有个叫a and list,我们现在呢,把我们的这个策略放到这,这是呢,我们的参数策略,我们就叫primeetter strategy primeter,我们的strategy,好,我们把我们的这个策略放过来,而这个策略里边最关键的就是我们要传入我们这个参数呢,支持解析哪种,呃,哪种值我们要啊,指定支持解析哪些参数对哪些咱们这个参数对应的哪些媒体类型,那这个怎么做呢?那非常简单,因为我们这个media types都已经放在这了,那我们就不妨给media types里。
06:34
这样用put就行了,Put哪些呢?其实这一块呢就非常方便了,大家就看到的是大家以前的样子,因为我们现在呢,第一种我们还要支持杰森,所以呢我就放一个叫杰森,然后呢,它的媒体类型,我希望它返回的是application杰森,好,我放了一个,然后呢,接下来media types,我再点一个put put呢,如果你给我传一个插面,那我呢就给你返回插面数据,我呢你给我参数传插面,那相当于就对应的就是插这种媒体类型,同样的,那现在我们新签了一种自定义协议,比如我们就叫基金,那这种协议呢,我们就是media type是什么呢?是我们at硅谷的,只不过这个呢,我们还是用我们以前的pass media type,我们用我们的字符串,我们字符串的参数类型叫application X硅谷,好,这是我们自定义协议的内容啊,媒体类型,所以呢,相当于我们现在就指定了三种参数的值。
07:34
那format呢,就能传三种参数的值,那我们在这一自定义我们内容协商策略以后,自定义内容协商策略,那我们来重新启动,我们看会有什么不同,以前的内容协商策略里边走,我们现在重新启动,我回顾以前的内容协商策略,它里边呢,呃,虽然我们说这个内容协商策略,我们来看以前我们有没有截图,诶在这个内容协商策略里边,以前呢是有两个策略,一个是呢基于参数的,然后呢,一个是基于请求头的,那我们现在呢,给它重新定义了一下内容协商策略,然后呢,我们是定义基于参数的,以前呢参数只有两种匹配的值,现在呢,我们写了三种匹配的值,那接下来我们来重新来测试,我们来form ma杰森,我来回车,我们先来看一下,如果是杰森情况下,我们在这儿内容协商怎么做,哎,我们这儿已经给放过去了,虽然放过去了,但是呃,我们来给它全部放行,我们再来一次吧。
08:34
好,我们先来看效果啊,杰森是可以的,如果我返回机器啊,我我们在这呢,传一个机器,我们来看一下,看是什么效果啊,我们先直接放行,先让它效果能出来,我们再来看原理,哎,我们看我们的这个效果,如果form等于机器,那就是按照我们的这个自定义数据格式,以分号分割每一个值,所以呢,这个效果是什么呢?原因是什么?回车来看一下,好,我们先来放行,到我们指定的内容协商里边看一下啊,我们内容协商过程在这,在这呢,接下来就有一个重要的,先获取我们这个客户端需要的这个媒体类型,它能接收的媒体类型step into进去,我们在这contain negotiation manager,在这个manager里边呢,我们看我们的这个策略呢,这是我们新创的这个策略呢,看我们有三种,这就是我们传的那个map,哎,我们这三种呢,其中如果你传了机器,那就是想要application X硅谷,所以呢,相当于它是现在在这个manager里边有了我。
09:34
我们自定义的这个内容啊,适配策略,好,我们把这个拿过来,现在这是我们新的,这个新的呢,大家一定注意,那么新的呢,现在适配了三种。多添了一种好,我们把这个拿过来,来放在这儿,这是新的,咱们这个东西。这个呢是旧的,当然呢,两个一对比就明显能看出来,我们新的这个里边呢,它支持三种格式,第三种如果你传了机器,那就是application X硅谷,所以呢,相当于我们通过这个内容协商管理器,我们最终能得到,因为它是基于参数确定的,最终怎么确定呢?相当于你的这个机器别名代表的是application X硅谷,相当于呢,我们这个客户端接收application X硅谷,而我们这个我们的这个服务端能产生哪些数据,它把所有的message统计出来,有一个message convert能产生application硅谷,所以呢,接下来它就在这儿来做最佳匹配,我们浏览器要X硅谷,服务端能产生十几种,其中呢就有一种是X硅谷,所以呢,我们最终相当于就能适配到我们,诶,我们刚才and我们已经进去了啊,就已经能适配到,我们到底用哪个媒体类型,就是用X硅谷,而这个媒体类型最终是用。
10:56
哪个解析器来进行处理的,想要用哪个message converter来处理的,大家看我message convert有一大堆,我们自定义的这个message converter才能处理X硅谷,大家来回到我们自定义的message convert,因为它呢干什么,它支持的这个格式是X硅谷,所以呢这就整个流程就串通了,那我们呢,只要前端传入我想要机器,然后呢,通过我们内容协商管理器,它一确定以后,你要你的这个机器代表的是呃北开硅谷,我们来看内容协商管理器,我们在这自定义了你的这个机器代表的是X硅谷这个媒体类型,然后最终呢,X硅谷这个媒体类型又对应的是我们的message convert,这个message convert来进行读写的,所以呢,最终就会调用它把数据写出去,那么整个呢,流程就通了啊,我们直接放行,我就能看到效果,那数据呢,确实已经写起来了,但是问题呢,我们现在来看一下,如果我们这一块还能不能用了,二布里开申,我现在变成阿布里开杰森,如果我们基于。
11:56
请求投的还能不能内容写上send的过去来看一下啊,基于请求投的我来发送过来,我们看一下基于请求投的内容协商还行不行,来一进来,一进来以后呢,来到最关键的一步,先获取我们浏览器能适配的内容类型,来step图进来,由于我们自己呢,自定义了内容协商管理器,这个内容协商管理器里边只支持参数的,所以没有请求图的内容协商管理器,由为我们以前大家看以前的这个内容协商管理器里边呢,有两种策略,一个是参数的,一个是请求投的,我们一旦一自定义了以后呢,只剩了一个参数的,所以它应该解析不出来,来看看解析出来的这个东西是什么呢?Acceptable types,它解析出来的是星杠星,那么没有任何匹配,他就认为是星杠星,而我们服务端能产生的是什么呢?我们服务端能产生的是这个叫呃一大堆11个,那最终我们能适配哪个数据,因为服务端能产生这么多,而。
12:56
我们浏览器端你不传,相当于我们解析不到,就是你没传,或者我解析不到,我就认为啥都行,那啥都行呢,那最终按照最高权重我们来看它最终给我们适配到哪个了,好,第一个呢,上来就直接适配上了啊,我们来看啊,在这呢来进行适配,我们这个适配呢,直接放行的media type to use子来看一下啊,能用多少种呢?像这11种都能用,你服务端能产生什么,因为我们客户端全都能接收,我也相当于没有规定啊,没有规定,有的说我解析不来,为什么没有规定,有的同学说你这明明不规定阿布克森杰森那吗?实际上不是,我们是规定了阿布里克森杰森,但我们的内容协商管理器现在呢,只能解析参数的,只能解析参数带来的,所以呢,没有解析请求图的,我们解析不到,就是能适配所有,能适配所有最终呢,就会拿到第一个我们来进行使用,大家看假而便利循环,直接拿到第一个额布里开根杰S,相当于你现在穿啥。
13:56
都给你返回的是什么杰S数据,我们来放行,好大家看我们在这呢,返回的这是杰S,那你这一块呢,就算是传插面,好哎,我我们来现在来看我来传插面,我来S的,我们直接来放行啊,你就算呢是传插面,但是我解析不了你的这个头,所以呢,我在这儿认为media types to use还是这11个,然后呢,最终我们还是给你写,写的是大家看这还是接色,然后呢,你这传什么,你哪怕传ABC,它写的都是接色,所以呢,现在相当于我们如果一旦自定义了内容写上管理器,那默认呢,我们的这个图的就失效了,所有返回的都是金S,那么想要基于请求图的也能生效怎么办?那就还是来到我们这个内容协商管理器这因为我们现在啊,只放了一个基于我们这个参数的,那我们接下来再放一个基于请求图的就行了,所以呢,我们接下来再拗一个。
14:56
我们基于请求投的这个叫header content negotiation strategy啊,我们的基于请求投的这个策略,好,我们把基于投的这个策略拿过来,这个策略里边呢,没有我们要传的什么,相当于我们整个内容协商管理器里边两种适配策略,一种是基于参数的,一种是基于头的,甚至于你还可以自定义基于其他各种东西的,基于路径变量的,基于一大堆的,你都可以重写,你可以自己编辑一个叫content negotiation strategy,那你都可以去来完成这个各种功能,所以我们现在呢,把它一填进去以后,我们来重新来看,原来我们没填之前,我们系统里边呢,现在只剩了一个我们能适配头的,现在我们填了以后呢,相当于我们既有能适配头的,还有能适配我们的这个叫参数的啊,以前呢,只有一个适配参数的,那现在把头跟参数的全部放在里边了,全部放在里边以后呢,我们来现在重新。
15:56
来测,以前的浏览器能用,但是我们这个客户端用不了,现在我们来看这个客户端,我让他写字。
16:04
我们来直接放行,我们先来看最终效果,他呢,给我们返回的是杰森,我让他写插。它呢,给我们返回的是我们来看一下啊,直接放行,我们来看它给我们返回的是差慢对吧,我们让它返回机器,它给我们返回的是自定义类型数据,所以呢,现在相当两个又都能用了,就说一旦我们一自定义以后,有可能会导致系统底层的一些东西没法用,那咋办呢?那我们接下来就应该,哎,我们来看一下啊,直接一放行,直接一放行,诶它在这呢,直接返回了406NOT acceptable就是我们基于这个头的,它没有适配到我们这个机器啊,我们这个不叫机器,我们叫X硅谷啊,我们这种媒体类型啊走。来直接放行,好,我们来看,现在呢就返回我们自定义的数据,所以这就是我们说的,大家呢,也在未来如果我们需要给系统里边添加自定义组件的时候,千万要注意,有可能有可能我们添加的组件,我们添加的自定义的功能会覆盖,会覆盖默认很多功能,导致一些默认生效,默认的功能失效,这个功能失效呢,大家就必须以得bug源码的方式,你找出哪一块到底失效了,你缺了哪个填哪个,就像我们这个叫自定义message convert的时候,它最终呢,缺了我们相当于能适配头的,而我们现在呢,给他把这个东西一添进去以后,我来看啊,在这呢,我们重新给他添了一个我们能适配图的这个策略以后,我们接下来我们发送请求,你就会发现原来系统里面。
17:56
但呢只有一种策略,现在呢就会多了一种,来看一下,在内容适配里边,好在我们这个内容里边获取我们客户端能接收的内容类型,在content negoti as manager里边,现在呢我们就有两个了,一个呢是什么,是基于呃,Primemeter的,一个呢是我们基于咱们这个header的,所以呢,现在hier parameer这两个东西就都能用了,所以大家一定要注意,那我们在这呢,因为之前竟用到了它的这个head的,导致我们head带呢不能用,现在呢,Head的能用了,你给我传什么,我就能从统里里边解析出什么,这就是我们说的整个自定义的过程,那现在我们完整测试一下,那我们整个的内容协商就应该是浏览器要什么也能要,浏览器呢,你用请求路径的方式,哎,你通过路径辨认路径的这个参数的方式,你能要各种不同媒体类型的数据,也可以通过客户端带不同请求图的方式要不同的数据,来可以看一下最终效果。
18:56
如果浏览器呢,想要杰森数据这么来传,想要插ma这么来传,想要我们自定义的数据这么来传,当然你不喜欢这个format名字了,你也可以在这个参数这一块,我们可以来看一下啊,你不喜欢format了,你的这个参数解析器,这个策略呢,你把它的这个名字变了prime name,这个prime name呢,原来默认叫什么,大家看一下啊,这个默认你没写它就叫format,你可以变一下,你你变为什么就叫什么,你变为FF,那以后呢,那这一块传的就是FF,所以呢,大家就注意这是我们说的整个,呃,内容协商的过程,包括我们自定义啊内容协商,我们最终也出现了我们整个完整的效果。
我来说两句