背景
业务方经过某些业务处理之后,带过来了一系列参数。其中,有个url参数供回调使用,但这个url经业务方处理后很特殊,带过来回调时频频出错,无法正常回调给业务方。于是,通过分析部分源码,剖析一下回调的流程。
编码 解码
说到url的回调,很容易联想到decode、encode,即编码解码操作。
通常来说,需要编码操作即意味着不适合直接传输,某些字符可能有歧义,如中文、特殊字符等等。
而通过编码之后(如 utf-8),传输给服务端,服务端自行解码,便不会出现一系列乱码问题。
说明
按照如上所说,业务方带过来了处理后的url,另附上说明,url无需解码,直接回调即可,但事情往往没那么顺利。不管是使用spring5 webclient,还是restTemplate以get请求回调业务方,均会出错。由于最终使用了restTemplate解决了问题,对此本次剖析一下restTemplate。
注:WebClient同样可以解决问题,剖析restTemplate的因由在于综合分析了项目的引用和耦合度,不适合改动webclient模块,故而拓展了restTemplate。
剖析
-
先写个极其简单的单测入口,进行RestTemplate的源码分析。
-
紧接着集中分析RestTemplate类
-
请求头、请求体是由RequestCallback来处理的,请求结果是由ResponseExtractor来处理。
-
RestTemplate默认已经初始化添加了许多对象读写转换器。
-
进入execute这个重要的方法继续分析。
-
可以看出,先用UriTemplateHandler构建URI,再走关键逻辑。
-
UriTemplateHandler build