00:00
好,前面呢,我们说了一下http message convert原理,就说只有我们方法标注了responsibility body注解的时候,我们的返回值呢,会被request responsibility message method的这个processor来进行处理,它里边呢会使用各种message convert来看谁能处理,再看谁能处理的过程中有一个非常关键的一步,其实就是内容协商,这个内容协商呢,就是通过便利所有的message convert,最终呢决定来找到一个能合适处理这个媒体类型数据的message convert来进行处理。那么接下来呢,就来看一下整个内容协商的整个完整流程,那我们先来体会一下完整的内容协商功能,比如我们现在看到我们的这个页面,那我们只要刷新,那我们返回的是一个接森数据啊,我们直接把所有请求全部放行,那如果在某些情况下,我还想让它返回插麦数据,比如我们客户端的部分不同浏览器给。
01:01
或发请求我来返回杰森,比如我们现在安卓客户端给我们发请求,那我们想让给他返回插麦,那怎么办呢?我们是难道需要去来写两个方法吗?其实我们就可以用spring m VC的内容协商功能怎么做,我们还是这个方法,我们让它在不同的情况下,简单来说内容协商就是在不同的情况下我们能返回不同的内容,然后根据我们最终是根据我们客户端接收能力的不同,我们这个浏览器说哎,我能接收所有内容,那我们这个比如安卓客户端说我只能接收杰森,那比如还有一个客户端说我们只能接收插麦等等,那我们根据最终客户端接收能力的不同而返回不同类型的媒体数据,比如我们返回杰森和查马,那么现在呢,就以杰森查马为例,我想要让他支持完整的内容,写上功能,我可以这么做,首先呢,我来引入一个支持插麦尔的依赖,因为我们支持杰森呢,我们用的还是咱们的这个叫扎克son的这个工具。
02:01
包来支持接送的,同样它也有支持插麦的,所以我们可以把扎S支持插麦的模块,我们现在来导进来啊,在我们的这一块,我们来直接导进来,我们不用写依赖版本自动管理被你配置好,那导入进来以后呢,接下来我来重新启动应用,好,我现在来重新启动,我们要做的只是导入一个插面的依赖,我重新启动应用,接下来我们还是来发test person请求,我们看会有什么样的不同,好,同样呢,来到我们这个浏览器,我们来发送test和person请求,我们看现在的不同是什么,那以前呢,给我们返回接送数据,我来回车,那我们发现呢,现在返回了这么一个数据,这是个什么样的数据?来点开person,我们来看一下,在我们发送请求的时候,请求头,请求头里边呢,内容协商关键的一点就是请求都告诉我们服务器说我这个浏览器具备接收什么样的数据的能力,其中呢,插麦是优先接收的,所以呢浏览器。
03:01
最终给它响应数据的时候,大家看响应的这个内容类型叫XHTM2加插麦,然后呢,我们来看响应的真正内容,它呢其实是一段插麦的这个文档,而我呢,真正想要返回接S数据,那又怎么办?所以呢,我把完整的能力,我使用post曼来测试一下,我们来打开post曼来发送test person请求,我来点四的,诶我们发现呢,它返回的是这个杰S,比如说你会发现那有的时候它返回的是插面,比如我来右键查看网页源代码,明显的能看到我们服务器给浏览器返回的是一段插面,而有的时候呢,又返回的是一个JS,为什么的原因就在这儿,我们来到使用post曼,我来测试发送test person的时候,我们来看P曼带的这个header请求头,在这个请求头里边呢,其中有一个accept,这个accept里边呢,有一个叫星杠星,星杠星的意思,我能接收所有,那能接收所有呢,默认给它返回了一个接算数据。
04:01
而如果我来调整一下,比如我把这个accept我来调整,那我呢就不用它上边指定的这个相当于模拟我们浏览器发送请求的时候来带的这个accept请求头,Accept请求头就是告诉服务器我能接收什么样的数据,那我来先来测试第一个当我写为呃,不离森杰森的时候,好,相当于我接收杰森这种数据的时候,我来发送请求,接收的是杰森,但是相反的,我如果写的是插麦,我们来发送数据,诶我们接收到的是一段插文档,这个呢,其实就是我们spring mvc,我们在底层提供的非常方便的内容协商功能,根据你客户端的这个能力的不同,我可以自动的给你处理出这些数据,那这又是什么样的一个原理啊,我们可以来总结一下,我们想要用post曼测试非常方便,只需要,只需要改变请求头就行了,改变请求头中咱们的accept字段。
05:01
Accept字段,Set字段,这个字段呢,是我们这个HTTP协议中,协议中咱们这个规定的,相当于来告诉服务器,告诉服务器啊本客户端等客户端可以接收的数据类型,接收的咱们这个数据类型,所以我们只需要改这个字段,我们就能测出不一样的效果,诶我们accept可以改为application离开查,或者呢,咱们在这也可以来写application解S,这两个呢都行,我们都就写在这,那为什么我们写它不同种方式,它就能给我们返回不同的效果,我们可以来看一下,首先呢,你要支能支持杰森,前提是我们得导了这个插码的这个data format data format这个扎son的这个包,导了以后呢,接下来我们来看一下它内部的内容协商原理,好,我现在呢还是以debug的。
06:01
模式来进来,那现在来重新对吧?什模式代码呢,我们一个没变,但是它具有了返回接S和返回插慢两种不同的能力,我们看呢,它这个能力是如何实现的,好,现在我来重新来发送请求,我们呢,现在是以啊不离开插麦这个请求图我们来发的,然后呢,我来点击send请求来到我们的这一块,我们来进行处理,我直接放行放行放行放行到我们这一块呢,来处理处理,让它先有返回值再说,好,这是调用目标方法好处理,有了返回值,有了返回值以后呢,我们接下来走下一步,走下一步呢,我们的return handler,最终要找到所有的这个handler,因为我们标了responsibility body,所以呢,最终会找到我们responsibility body能掉到那个handler叫request responsibility body message processor,就是它呢支持我们这种方式,它的底层利用message convert,好,Step into来看message convert怎么做进来。
07:01
拿到我们这个返回值,先判断返回值是不是资源类型,好接下来呢,我们的内容协商的核心流程就过来了,首先呢,在这一块大家注意我们的整个关键环节,好,我们来给他记录一下整个内容协商的原理,首先第一步,第一步呢,他在这准备想要确定叫selected啊,Media type啊,我们来给他放行,这生明了一个第一个,他先来判断我们当前的这个响应,因为我们这个请求要响应出数据,先来看这个响应有没有在之前已经被人处理过,比如我们拦截器在之前已经给他写了一些数据,已经写死了这个内容类型了,所以呢,他先来判断当前响应里边是否是已经有了明确的media type,判断当前响应,当前响应图中是否已经有确定的媒体类型,那就是。
08:01
不说的这个media type,那我们第一次请求进来肯定都没有,包括第二次进来也没有,只要我们没有前置的拦截过程,没有给他确定媒体类型就没有,所以呢,没有的话呢,我们是一个全新的处理过程,我们来到这儿,如果有的话,就用你之前确定的这个媒体类型,那我们之前没确定过好用这个来接下来来到关键的环节,第一个环节叫get acceptable media types获可接收的媒体类型,所以呢,这个叫获取咱们这个客户端,客户端指的就是我们当前,当前我们是用post慢测的,那我们就是用postman,你用浏览器,那就指的是你浏览器获取客户端支持的,支持的咱们这个请求的,支持的咱们这个内容类型,也就是说客户端我能支持接收,支持接收的内容类型,客户端发请求的时候就会告诉服务器我能支持哪些数据,是通过accept字段,所以呢,简单。
09:01
但说就是获取获取客户端except字段和请求投字段的请求投字段的请求投资端,那我们可以来看一下,我们客户端呢是post慢,所以呢,他在这如何获取step into进来,进来呢?它使用的是content negotiation manage,这叫内容协商管理器来帮我们来解析媒体类型,怎么解析的,我们来step into进来,Into进来呢,先会包装对象,把这个对象的包装放行。啊,然后呢,在step into进来,进来呢,我们来看一下它呢,在这叫strategies,相当于利用我们的这个,这有一个叫header content,相当于使用我们这个请求投的内容的这个策略来解析我们这个,呃,媒体类型怎么解析的step into进来大家就会发现啊,非常简单的过程,就是调用我们原生的request请求的get header values来获取我们accept字段,所以呢,我们现在获取到accept字段的值是我们的application差,因为我们postman客户端给我们发请求的时候,Accept的字段是application,所以呢,我们现在得到了这个值,那得到这个值以后呢,它转为list,最终把我们这个值好给我们这个集合整个转换过来,我们直接返回,相当于呢,我们得到了一个我们客户端能接收的数据类型叫application查,所以呢,第一步先得到。
10:33
客户端能接收的这个数据类型,那现在呢,得到了application查面,接下来看第二步,也就是说呢,我们服务器现在知道了你的这个客户端啊,浏览器也好,Postman也好,只能接收插类型数据,接下来呢,在这又有一个叫get proable media type,叫获取我们能产生的媒体类型,所谓的能产生的媒体类型就是因为我们知道我们一发请求调用这个方法,那么这个方法返回的这个对象到底支持以什么样的方式写出,所以呢,它在这会调用这个方法,这个方法是怎么样的,我step音图进来就会来到我们非常熟悉的流程,好,我们先来进来,他先从我们这个request请求域中来获取,相当于我们这个,呃,获取一个默认的这个媒体类型,什么都没有,好我们主要呢,他在这要有一个判断,大家看关键的判断在这了,他呢会拿到所有的message converts,哎,我原来有十个。
11:34
现在呢,有11个,因为我们导了插麦相关的依赖,所以呢有插的相关的这个message convert,好,那现在呢,他拿到所有的message convert怎么办?他把所有的message convert,如果哪个message大家看看right能支持这种媒体类型的这个读写哪种媒体类型呢?其实就是我们的这个大家看是想要把person对象,把person对象然后呢给给我们,最终要写成我们指定的这个数据的,如果他支持我们对person对象的操作,它就在这儿调用correct判断,如果支持就把我们当前message convert支持的这个媒体类型给我们放到媒体类型集合里边,所以我们最终来看,我们来step into,走,我们来看这是第几个string的convert好不行,好,呃,我们调这个else if就说如果你是这种类型的啊,调用它里边的,如果你不是调用s l if,那step into。
12:34
看right,我们来看啊,现在呢是string的,String支持什么媒体类型,是支持浪的,所以呢也什么都不加,然后呢,再来看step into,然后呢,接下来来到了我们的再来看,呃,Support首先呢,支不支持string,呃,不支持我们person对象呢,这几个直接不支持,我们来到能支持的人里边,Resource也不支持,我们来看啊,能支持我们操作的resource也不支持,大家注意看这边,这都是我们之前走过的逻辑,还有这个OLDOLD也不支持。好,接下来来到man Jackson to了,这个东西呢,它一定是支持的。step into来看啊,Can can write来,Step into进来,他呢,我们的这个媒体类型呢,是空的,那我们支不支持写空媒体类型的东西呢,也支持,但是我们当前这个人好,他能给我们,他如果支持的话,把我们当前的convert大家注意啊,我们现在呢用已经便利到了,叫mapping Jackson to。
13:34
Http message converter,因为我们这个message converter呢,它是支持所有对象的,但是呢,这个converter来给大家看一下,叫map Jackson two manping Jackson two htp message convert,诶,这,这怎么是别的manping Jackson two HP message convert要说呢,一旦我在这遍历循环看哪个message convert能支持操作你了,然后呢,我们把当前message convert所支持的媒体类型给我们放到这个列表里边,大家看,我们呢想支持OB里开杰森,那为啥呢?因为我们现在呢,这个converts虽然很多,我们现在呢,其他convert根本不支持操作person对象,只有从这开始往下的这四个convert支持操作person对象,而前两个呢,它支持支持将person转为接,后两个呢是支持将person转为插。所以呢,我们最终会找到这。
14:34
我们把这一个过程给大家说一下,然后第三个它呢是便利循环,便利循环所有的message,循环所有当前系统,当前系统的message convert convert,看谁支持,看谁支持操作这个对象,操作哪个对象呢,就是我们返回值person这个对象,然后呢,找到支持的,找到支持操作,找到支持操作person的convert convert,然后呢,把所有convert,把这个convert,把convert支持的媒体类型,支持的媒体类型统计出来,这个统计出来相当于是什么呢?相当于就是它每次呢,要得到我们当前系统里边,那我们。
15:34
当前系统里边,我们整个系统底层的这11个message converter到底能支持哪些类型的数据,相当于它呢?想要得到我们这个东西,对吧,相当于我们系统的底层能力,所以呢,相当于我们这个result里边先会放两个来,我们当前系统底层呢,支持操作杰森,好,那接下来我们来继续来到第二个message converter来看第二个message convert呢,还叫map扎son,其实是一个东西,所以呢它也支持把这个结果呢又放进去,所以我们这个result里边有四个,这四个呢,其实两两重复,哎,都是能操作节省的,大家也能看到这6171 6171连对象的这个呃东西都一样,所以呢,它最终它还会去重啊,所以呢,我们看到支持杰森的这个message convert,它能将数据转为杰S来,我们现在统计到了我们系统的底层能力,首先能将数据转为,还有一个支持操作,我们对象能将数据转为我们来看这个convert,这个呢。
16:34
啊,判断也非常简单,都是我们以前的这个基本判断,哎,我们直接就能操作啊,只不过呢,他能操作他我们的新的这个convert叫mapping扎s two插面,好ctrl n mapping扎son two插面,我们的这HT message convert,而这个convert呢,所能支持的这个媒体类型是application杰,所以呢,我们会找到又一个convert,它能支持操作person对象,因为map这个maping Jackson系列的convert,它的这个support是直接返回为true的,所以它能支持操作对象,而这个操作对象呢,能支持操作application插麦和test插麦和application星加插面啊所有东西以及插麦,所以说呢,我们在这又统计到了,然后呢,接下来又来到一个卡沃特,这个沃特呢,其实还是这个,呃,查迈尔的这个卡沃特,然后呢,他还把这个最终统计结果拿过来,所以呢,最终我们这个统计结果里边。
17:34
就会出现这样。就会出现呢,我们当前系统对于当次请求支持我们返回杰森以及插马尔数据,所以呢,我们现在看到内容写上原理就是统计出来,统计出来以后呢,现在得到的结果是客户端,客户端需要呃差慢,我们现在知道了客户端需要application插慢,而我们的这个服务端能服务端通过统计他们所有的message convert服务端发现服务端呃能力,他的能力呢,能处理多少种,能处理这么多啊,服务端的能力。
18:15
有十种对吧,服务端的能力就是这么十种,这十种呢,相当于啊,我们统计出了服务端到底能干嘛,就是这十种啊,包括我们的杰S和插慢啊,服务端呢,我既能帮你返回杰S,又能返回插慢,那这个既能返回杰S又能返回插慢,其实是得益于我们底层的两个卡沃的统计结果,一个是转接森的,一个是转插慢的,那这个统计结果一出来以后呢,我们接下来继续看六,那现在呢,既然我们这个媒体类型好,我们现在得到了这个result,相当于呢,我们统计了两个我们客户端要呃理克生杰森,而服务端呢,现在具备的能力是帮你产出十这么十几种数据,然后呢,接下来得到这个结果以后呢,就来到关键的匹配环节,在这大家看这这个一个for循环双层嵌套,先来遍利所有的acceptable types就是。
19:15
是呢,我们浏览器能接收的,然后呢再来看服务器能产出的,最终呢,看浏览器能接收的类,这个类型有没有能匹配服务器能产出的这个类型,如果有的话,这个类型就是我们最终要用的类型,所以呢,他在这儿做一个最佳匹配来看啊,因为现在浏览器能接收的类型只有一个,所以这个for循环进来一次,而服务器能产生的有十个,来看产生的这十个,第一个类型叫applicationlic杰森,Applicationlic杰森类型跟我们当前的这个applicationlic查尔类型匹配吗?这个肯定不匹配走,所以呢没有决定的。接下来第二个,第二个呢叫application新杰森,它也不是插门,第三个叫application杰森,也不是插门,第四个叫application新杰,因为它两两重复了,也不是。第五个叫奥普里开,大家注意奥普里开差来看能不能走,哎,我们发现呢,这两个是匹配的,媒体类型是匹配的,所。
20:15
所以呢,我们最终,哎,Media type to use,哎,我们最终要使用的媒体类型,我们会放进去里边呢,放进第一个,我们最终决定好我们用chamer,哎,服务端能产生很多,但是客户端人家只要插麦,所以服务端最终知道了啊,那我就要插麦,那有些同学说你在这儿匹配这么一大堆,不如客户端要什么我们就给什么呗,其实不是那样子,客户端有可能要插板,我们现在根本都不具备处理插麦的能力,所以我们可能还得报错呢,所以我们在这儿呢,这个便利循环很重要,而且这个循环呢,是一个比较好的这个匹配,要说客户端比如要插慢,我呢,能给我返回HTMR,或者能返回所有,或者能返回插,就是呢,我的这个返回能力里边,哎也包含你,那我也能用,所以呢,这不是一个完全匹配,这是一个叫最佳匹配,好那我们的这个插麦派和插麦那肯定就不行了,呃,离开成星插麦就不行了,呃,不离开插麦又行了,所以。
21:15
我客户端要application插麦,那我们现在就来找出我们所有的application插麦,那我们现在呢,最终相当于决定了我们要用的媒体类型是application差,然后呢,把这两个再去个重就行了,我们来看啊,走到这一块sort by,它呢在这呢会排个序,我们来看,排个序以后它也没去重,那其实就是这两个,那现在呢,我们就决定了最终我们要用哪个好,我们把这一块的这个for循环非常重重要。第六个,然后呢,进行最佳匹配,进行我们叫内容协商的最佳匹配,协商的最佳匹配,那最佳匹配呢,就是拿到我拿到你浏览器想要的类型和我能支持的类型,然后看呢,你想要的有没有在我能支持的这个列表里边,如果在,哎我呢就能支持处理你这种数据,好找到最佳匹配以后,接下来大家看该怎么做,找到最佳匹配了以后,那成了,那我们现在知道要给我们这个浏览器返回application接数据了,那将来怎么办呢?相当于select media,相当于我们要给浏览器返回的就是application杰森,所以呢,虽然它这有两个一模一样的,但是我们在这只要判断成功,就直接补break了,Selected,我们选中的这个媒体类型,它呢永远只有一个,所以我们给浏览器返回的呢,就是固定的application插好。
22:46
我们现在既然知道了要给浏览器返回插面了,且接下来最关键的又来了,就再来看convert谁能支持将对象转为插麦,所以呢,大家会发现这个沃用了两处,第一处呢,是来统计我们当前系统里边所有的message convert,看他们整个合起来能支持哪些数据,然后呢,找到我们跟请求的最佳匹配,找到最佳匹配以后呢,接下来第二次,第二次再来找能将我们当前这个类型person类型转为我们指定的插麦的convert,所以呢,它进行第二次匹配,第一次匹配呢,只是统计我们这些具有啥能力啊?好,我们可以来走一下,其实spring mvc可以在底层把这个做一个优化,因为我们的这个message convert大家现在都知道,系统一启动,这11个已经固定好了,其实就可以在系统初始化的时候,甚至于在第一次请求的时候,将message convert的所有。
23:46
护理能力全部缓存起来,然后比如就是这个这个东西呢,没必要每次获取可以缓存起来,这其实就是一个优化,但是他在这一块呢,没做缓存,所以呢每次你过来获取其实挺麻烦的啊,这也是慢的一点好,所以呢,我们一旦匹配上以后,最终找到我们的这个message convert,我们来看啊,我们最终找们会找到哪个呢?我们现在用resource这个message convert肯定不行,我们这十几个message convert能操作,大家我们再来总结一下,能操作person对象的只有我们这几个,只有从七到十,但是能把person对象转为插麦的只有后两个,前两个是把person转为Jason的,所以呢,我们最终通过前面的最佳匹配,我们得到了一个,哎,我们想要把person转接转插麦那,最终就会来到我们的指定的东西,大家看map Jackson to,这个肯定不行,这个为啥不行?因为他只能把person转为杰森。
24:46
那第二个曼扎克son to他也不行,他是把person转接森,大家看这曼扎克son to插麦他行,他是把person转插麦的,所以进入到了我们if判断拿到我们最终要转的这个body数据,这个数据呢就是我们person对象,然后呢,再利用底层它的这一这些行为啊,比如进来直接来调用write方法来进行write step into就回到之前了,先给它加一个默认的响应图,我给你响应接S数据了,对吧,这个响应图呢,其实就是啊,我们要给你不是响应杰森,我们要给你响应一个person数据了,我们可以看一下我们的这个响应头,响应头里边content type内容类型叫OB,我们的这个插面,哎,把person呢给你响应成插了这个插面咋响应呢?就调用right internal在底层又是调用object member,只不过这个object member呢,不是把它转接,而是把它转person啊,转插麦来看啊下边的这个。
25:46
还是拿到object member,然后呢,你要写成什么类型啊,我们前面呢都能匹配到各种媒体类型,然后呢,用你这个writer进行write value,要是说最终把我们这个person对象啊转出去,怎么转呢?那就来到我们这个底层,因为我们的这个配置,我们现在是要我们的这个genator叫to插麦的,Genator是来转插麦的,如果是杰森,那就叫土杰森genator,所以呢,我们现在是转插麦的,自然而然我们这个数据就会被写成一个插面,插面呢整个写出去以后好output message我们可以看一下它的请响应题里边,响应题里边buffer里边的这个数据你可以来。
26:29
Well as。好,我们就能看到,这就是一段插码,所以呢,这其实就是我们说的内容协商原理也非常方便,就是来统计底层所有的message converter,看他们都能处理哪些数据,然后找到一个最佳匹配,找到最佳匹配以后呢,用用支持我们这个最佳匹配的用支持将对象转为我们这个最佳匹配媒体类型的卡沃。
27:05
最佳转为最佳匹配媒体类型的抗玩塔,然后呢,调用它进行转换,调用它进行转换,好就是我们这么一个原理,这是我们的message convert,这是我们说的内容协商,好我们整个内容协商呢就结束了,最终就给我们响应了一个插码,同样的,如果是杰森,我们再来串一遍,如果是杰森我们来送的请求发过来,发过来以后呢,我们直接来到它内容协商的整个环节,好。来到这,好,他想要用的媒体类型啊,这一块呢,先前置的有没有被处理好,我们这儿不用管好,现在看我们请求能用的媒体类型,请求接收的是杰森,而我们响应能产生的,这其实就是那一堆for循环,响应能产生的是我们这十种数据,杰森以及插麦,然后呢,最终在这寻找最佳匹配,最佳匹配呢,那就肯定是我们能用杰森,然后找到杰森以后呢,好,最佳匹配我们找到了杰森,找到杰森以后呢,现在我们最终要响应杰森数据,然后呢,再来遍利所有的message convert,看谁能把对象转为杰森,好我们可以来看,一个一个看,我们把这个for循环呢,就直接就断接打到这,放心。第二个这个叫resource,它呢不行,第三个resource region也不行,Source也不行or也不行啊,这个呢就行,这个呢是把我们这个杰森啊,我们看能转的对象转杰森body拿到了,然后呢,接下来他转。
28:37
转完以后呢,就得到了数据,所以呢我们现在又能看到给我们返回接省数据,而如果我们注意,如果我们是用浏览器发,那为什么又返回的是插麦浏览器发,为什么又返回到插来回车给大家看一下浏览器呢?因为我们发请求的时候,我们请求的这个请求头,我们能接收的类型,你看插麦是具有权重是0.9最高优先级的,没有写杰森,所以呢,接下来我们来到最佳匹配环节,我们可以看一下。
29:13
好,来到我们这一块的匹配,我们来看一下整个的匹配,我们浏览器客户端能接收的内容类型,在这能接收的内内容类型挺多的,有七种,这七种呢,相当于最终统计出了我们客户端能接收到这些内容类型,然后我们能产生的内容类型有十种,然后呢,这七种带十种,然后在这来寻找最佳匹配,那最终的这个最佳匹配我们来放行,来看它最终把哪个给最佳匹配上了,就是呢把插门最佳匹配上,好我们这个acceptable相当于能接受的是application差面,HTMMR加插面,所以呢,相当于按照人家权重优先匹配原则,那我们是优先匹配到了查码,所以呢,浏览器发请求默认会给我们响应插数据,好,我们现在直接重新放行,重新放行它里边呢,加了挺多的,好,那最终看一下它里边加了哪些,好在media type to use里边加了14个,14个呢,都是跟。
30:13
我们这个插麦相关的,然后呢,因为杰森的这些权重比较低,你看啊,虽然说呢,我们这个数据的,呃,媒体类型,那我们这个杰森呢,也是星人能匹配,但是它的权重呢比较低,然后呢,最终它在下边呢,就会来找,在所有的这个里边就会快速的来找到一个第一个就是最佳匹配,就是场面,所以呢,这就是我们说的整个的内容协商,你浏览器,你的客户端要什么,我就给你给什么样的数据,当然我们现在能看到的这个能力就是我们导入了这个插麦以后,我们能支持杰森和插麦了,那有可能呢,大家在公司工作的时候,可能还会牵扯到自定义类型的数据,对吧,我们自定义的一些协议,什么自定义的数据,那自定义的数据呢,自定义的这些媒体类型我想要做,那我们就要牵扯到什么叫自定义,我们的message convert自定。
31:14
E message,看,那这个东西呢,我们下节课再说,那这是我们整个的内容协商的流程来,我们翻译过来其实就是所有的message,所有的message convert合起来可以支持各种媒体类型数据的操作,但这个操作支持什么?支持读和写,因为我们看到message convert的接口就是说看read能读吗?能读就调读就调read方法,然后看write能写吗?能写就调write写方法。我们可以再来回头看一下http message converter的这个接口设计message。
32:01
Convert,好,我们来看一下这个接口设计,就是呢看read,如果能读,那就会调用下边的读方法,将我们呃传入过来的消息读成我们指定的类型,如果能写,就调用写方法,把我们返回的数据写到我们指定的这个响应里边,这就是我们的message convert以及它的内容协商功能。
我来说两句