00:00
好,前面呢,我们说了一下内容协商原理,最主要的一个核心就是在内容协商的过程中,我们会通过获取客户端能支持的这个内容类型,最终决定给客户端写出什么样的内容类型数据,而他怎么获取到客户端接收的内容类型,他默认呢,是根据我们这个客户端我们发请求带来的accept请求头字段获取的,我可以把这个呢再走一遍,比如们浏览器来发送请求,我来刷新,我们来刷新以后呢,我们来放到来到内容协商的这个过程,这好我们来稍等一下,来到这,它在这呢,开始商量媒体类型,在媒体类型里边呢,我们先第一步叫get acceptable media types,就是先来获取我们这个可以接收的这个媒体类型,相当于客户端,它支持哪些数据,而这些数据呢,我们再来step into进来,大家看到会用一个叫content negotiation manager,叫我们的这个内容协商管理器,最终来解析出来的。所以在内容协商。
01:00
里边呢,有一个关键性环节就在这儿,是通过获取客户端,通过获取客户端能支持的这个内容类型,最终决定给客户端写啥数据,但他是怎么知道客户端能支持的那个内容类型,默认呢是用这个content negotiation,我们的这个manager,我们称为内容协商的管理器,内容协商管理器管理器,内容协商管理器呢,它里边呢,会有这么一个东西在这个内容协商管理器,这个管理器呢,点进来,它里边呢有一个策略,这个策略呢是我们基于请求投叫header,呃,基于请同求投的内容协商策略,所以呢,这是一种策略模式的设计,然后呢,它里边呢,它默认是使用默认使用基于请求投,基于请求投的策略,来最终知道咱们这个客户端能接受哪些。
02:00
所以我们在post慢测的时候,请求头的accept字段带的是什么就是什么,所以我们现在来确定一下step into,再进来,进到我们的这个方法里边,Step into,哎,我们会发现,好,我们把这个构造器呢放过去,重新在step into进入它的result me里边,它呢会使用内容协商管理器里边的所有策略,它遍历所有策略,默认里边呢,只有一个策略,这是内容协商管理器里边可以用的这个策略,好,我们把这个统计到这,比如是这个。所以呢,它默认呢是基于请求图的策略,所以呢,我们最终会看到它里边的核心的一个,如果我们是利用这个策略content的那个实验室内容协商策略,内容协商策略我们用的是基于请求头的内容协商策略的话,大家看内容协商策略呢,这也可以是一个函数式接口,这也规定了很多接口,其实呢,它拥有非常多种这种策略,可以基于请求头的,对吧,也可以基于我们这些一些路径的扩展变量的等等等等,所以呢,我们现在默认呢,由于是基于我们的这个请求头,所以呢,最终如果我们调用它的这个解析方法step into进来,我们看到基于请求头的这个内容协商策略ctrl home,就是它CTRLC,哎,我们把它复制到这,如果是基于请求图的这个内容协商策略,它最终呢会调用我们这个方法来确定他,确定客户端可以接收的,确定客户端可以。
03:36
可接收的内容类型,可以接收的内容类型它是怎么确定呢?其实非常简单,来到这儿就是request get head value,然后呢,这个accept字段啊,就是获取它的值,先获取我们请求图里边的值。最终把我们请求图的accept的值拿过来,当成我们客户端能接收的这个内容类型,那我们接下来呢,就跟我们服务器里边进行匹配,客户端想要我们这个accept字段里边的这些内容类型,看我们服务器能不能写,如果能写就给它写出去,所以呢,这是内容协商原理的一个核心,但这个核心呢,我们现在如果用到浏览器上有点不合适,就是呢,我们现在好,我把这个断联呢,呃,好,现在已经放心完了啊,如果我们是用posts曼测,我们可以很方便的改变请求头,但如果我们是用浏览器,我们在这儿来发请求,F12我来直接回车,因为浏览器呢,我们没办法在这自定义请求头,除非我们发Ajax请求,我们在Ajax请求里边规定好content的态度,否则呢,我们在这没办法规定好我们请求头,我们要接收什么样的内容类型,这都是浏览器给我们自动整的,所以呢,我那我浏览器现在呢,返回的这个数据,我们可以给大家放行,因为现在呢浏览器。
04:52
默认是优先接收插麦,所以我们现在呢,返回的数据,这一定是一个插麦,好,我们右键检查网页源代码,我们看到呢,这是一个插麦,但是呢,如果我想要返回杰森怎么的,那除了能改我们请求图外,我们还可以用另外一种模式,在spring m VC底层呢,也开启了对浏览器来进行内容协商的快速支持,如果我们是以客户端postman或者我们其他的客户端的方式,你能改请求都要改,但是如果是浏览器的方式,那为了方便,为了方便内容协商,内容协商,那然后呢,我们可以开启开启基于咱们这个请求参数参数的内容协商功能,因为呢,默认它如何进行内容协上是根据你请求头你能接受什么样的内容,我给你写什么样的内容,但现在呢,我们浏览器请求头没法改,我还想让他一会写接S,一会写插麦,想写什么就写什么,怎么完成呢?
05:52
啊,我们可以看,想要完成这个功能也非常方便,只需要来添加一个设置,在我们application页面里边,我们可以有这么一个设置,有一个叫favor fair里边呢有一个content negotiation叫内容协商fair parameter就是我们这个参数,参数呢它默认是first的,我们给它开启,开启我们这个参数方式的内容协商,如果开启参数方式的内容协商,我重新起来,那就会出现什么样的效果呢?我们可以把这个开启点进来,我们看一下啊,它这呢是开启了我们这个内容写上啊,开启了这个内容写上呢,就是如果我们请求带来一个参数format,那接下来你可以在这个format后边,你告诉我你想要返回什么样的内容,那我接下来呢就给你写什么样的内容,所以我们接下来就来到这儿,这是我们的,我们现在通过format参数,比如我们还是发test这个请求,我们format,比如我们来变成插,我们现在呢想让它返回插。
06:52
那回车,那它呢就返回的是插码,当我现在想让它返回接S回车,那它返回的就是GS,这相当于我们就开启了基于请求参数的内容,写上非常简单一句话,我们把这个呢点开,那为什么又能起这样的效果,我们可以来看一下。
07:11
在这好这开启基于请求参数的内容协商,只需要呢一处配置就行了,这一处配置呢,主要是content negotiation就是开启我们来备注一下,这个呢,开启请请求参数参数内容协商模式。而这个内容协商模式的这个使用就是发送请求的时候,给我们带上这个format字段,我们这个format字段是什么,它就是什么,好,我们把这个拿过来。而要追踪到它的这个原理,我们以后呢发请求,发请求就是这样好,那发请求呢是这样,Form呢可以是杰森,然后呢,Format呢也可以是插。Format呢,也可以是差,当然你到底能format什么呢?那其实是我们这个底层支持什么,你才能写什么,而它的整个原理是什么呢?也非常简单,我们现在重新打一个断点给大家看一下啊,我们现在呢,以debug的方式,我们也不用重新打了,如果我们开启了基于参数的内容写上功能,我们看会出现什么样的效果。
08:27
来到这,好,我们现在呢,如果我发送task person forat,等于接S来回车,好,我们来请求发送,其实你发送这个请求,那我们来看啊,下面的这个请求,你的request header,大家注意请求头里边呢,还是插面,如果我们是用请求头来进行内容协商,肯定返回不了角色,但实际上呢,我们能返回角色,为什么能返回,现在我们来看一下原理,好,我还是放行到内容协商的这一块,因为在内容协上这一块呢,有一个最关键性的确定,就是确定我们这个,呃,客户端到底能接收什么样的类型数据,那我们来step into进来,Step into进来呢,以前是用我们这个内容协商管理器,内容协商管理器呢,是用基于请求图的方式,大家看啊,以前的这个策略里边呢,只有一个基于请求图的那容协商,现在呢,多了一个,只要我们开启了基于参数的,会多了一个基于参数的内容协上策略。而这个。
09:27
参数的名字呢就叫format。所以我们会发现就在这。而我们这个参数呢,到底能写多少个,因为我们参数名呢叫format,而只你能写多少个,其实就是这个内容协商策略,它里边呢,规定我们这个支持的这个值,一个是插麦,一个是JS,把这两个呢写过来。好,这是呢,基于我们参数的内容协商策略,我们把这个呢放到这儿,那最终呢,我们一开启它以后,最终里边的内容协商管理器就变成了,哎两个的组合,一个策略呢是基于参数的内容协商,一个呢是基于请求投的,那接下来我们来看,那它在关键性的确定这一步,他呢,因为关键性的要确定我们客户端能接收什么样的内容类型,确定客户端接收什么样的内容类型,内容类型那接下来呢,它就能确定很多了,因为呢,它现在有两种策略,所以接下来我们来看他怎么确定,但用内容协商管理器来解析我们的这个媒体类型,Step into,先出来再step into。
10:40
好,先出来,再次带背景图,好我们来看啊,它会遍利所有的策略,先优先遍利第一个策略,第一个策略呢,叫参数方式的这个策略,好然后呢,接下来看它是怎么解析的,Step into,那这个解析呢,我们来看一下啊,它在这呢,有一个叫get media type key获取我们这个呃,参参数的这个K,这个K是什么呢?就是我们叫format的这个东西,好,我们点过来这个参数的参数的名字,这个参数的名字就叫我们format,因为这是我们这个参数的内容,写上管理器里边规定的我们参数名字就叫format,所以呢,我们接下来就来看reserve media type k好,我们现在先来获取从请求中大家看啊,现在是从请求中获取一个请求参数,而这个参数的名叫什么,就在这计算一下,参数名就叫format,相当于呢,就是从我们发的请求里边错。
11:41
取请求参数的,所以呢,我们现在相当于通过请求参数我们就获取到了form等杰森,好,那我们获取到一个杰森以后,这一块就变成了杰森,我们相当于获取的这个的值是我们手写的杰森,哎,但是呢,这个杰森最终要被返回成我们的这个media type媒体类型,相当于把这个杰呢最终来看,哎,我们的名叫杰森,这个杰森呢,其实就是我们针对于application杰森的这一个媒体类型映射,那最终呢,把这个媒体类型返回,所以呢,基于第一个策略,我们得到了我们。
12:18
好,我们现在看啊,有两个策略,那我们现在呢,因为我们这个parameter优先,Primemeter策略是优先的,Permeter策略优先,优先确定是要返回接森数据,它是怎么确定的,就是获取请求头,获取请求头中的咱们这个format值。好,我们可以给大家把这一块关键的核心这一句源代码给大家贴在这儿,所以呢,它获取请求图中的这个值,然后接下来第二个它确定好了以后呢,那现在我们可以没可以接收的媒体类型里边去集合,里边就会有一个叫application杰森,然后呢,这个策略结束了以后,接下来我们来看啊,结束了以后呢,我们发现了它直接就返回了,返回的原因就是只要我们在这解析出了媒体类型,那就直接返回,对吧,除非呢,我们这个媒体类型给,如果我们在这解析出了媒体类型,它是等于星杠星,就是相当于还是一个模糊匹配,如果还是一个模糊匹配呢,我才给你继续编辑下一个,所以呢,就是我们现在就是这么多的策略,怎么办?谁优先呢?就是我们这么多的策略里边prime优先,所以刚才prime解析了里克杰森以后,我们用的都是奥里克杰森,如果所有人得到的都是星杠星,那最终就会。
13:46
给返回一个新杠,新好,我们接下来直接走,那我们现在呢,得到我们浏览器能接收的媒体类型叫application杰S,然后呢,我们服务端能产生的又有一大堆,我们这十几个有插麦,有杰森,而我们呃现在呢,由于我们浏览器想要杰森,你虽然能产插麦,所以在最终在确定匹配最佳媒体类型的时候,那我们一定匹配到的是杰森好,大家会看到前面两个杰森呢,If进去给它呢,已经放进去了,我们可以看一下放了一个application杰森好,我们直接放行到这,放进到这以后呢,最终我们要用的这个媒体类型啊,Media type to use就是application接S,所以呢,最终我们返回出去的数据就是节省格式,那呢,其实就是基于我们请求参数的内容,写上原理也就是非常方便,只要我们开启了这个参数功能,哎,那我们的这个。
14:46
内容协商管理器里边就会多一种策略叫content,哎,我们基于参数的这种方式,当然我们这种参数能不能支持,除了查麦尔杰森还能,能不能支持其他的呢?也能,那你想要支持更多的,比如我们现在想要把我们这个数据以PDF的方式生成出据,想要呢,给它生成一个Excel等等等等,那我们全部可以自定义我们的这个内容协商管理器,我们就可以实现这个功能,好,后来呢,我们再来说它。
我来说两句