伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

解析Spring RestTemplate必需搭配MultiValueMap的理由

什么是REST?

  REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描绘互联络统架构风格的名词。REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web 效劳,包括使用不同语言编写的客户端如何通过 HTTP处置和传输资源状态。
微效劳之间的大多都是使用 HTTP 通信,这自然少不了使用 HttpClient。
在不适用 Spring 前,一般使用 Apache HttpClient 和 Ok HttpClient 等,而一旦引入 Spring,就有了更好选择 - RestTemplate。
接口:
解析Spring RestTemplate必需搭配MultiValueMap的理由-1.jpg

想接受一个 Form 表单恳求,读取表单定义的两个参数 para1 和 para2,然后作为响应返回给客户端。
定义完接口后,使用 RestTemplate 来发送一个这样的表单恳求,代码示例如下:
解析Spring RestTemplate必需搭配MultiValueMap的理由-2.jpg

上述代码定义了一个 Map,包含了 2 个表单参数,然后使用 RestTemplate 的 postForObject 提交这个表单。
执行代码提示 400 错误,即恳求出错:
解析Spring RestTemplate必需搭配MultiValueMap的理由-3.jpg

就是缺少 para1 表单参数,why?
解析

RestTemplate 提交的表单,最后提交恳求啥样?
Wireshark 抓包:
解析Spring RestTemplate必需搭配MultiValueMap的理由-4.jpg

实际上是将定义的表单数据以 JSON 提交过去了,所以我们的接口处置自然取不到任何表单参数。
why?怎么变成 JSON 恳求体提交数据呢?注意 RestTemplate 执行调用栈:
解析Spring RestTemplate必需搭配MultiValueMap的理由-5.jpg

最终使用的 Jackson 工具序列化了表单
解析Spring RestTemplate必需搭配MultiValueMap的理由-6.jpg

用到 JSON 的关键原因在
RestTemplate.HttpEntityRequestCallback#doWithRequest
解析Spring RestTemplate必需搭配MultiValueMap的理由-7.jpg

根据当前要提交的 Body 内容,遍历当前支持的所有编解码器:
若找到适宜编解码器,用之完成 Body 转化
看下 JSON 的编解码器对是否适宜的判断
AbstractJackson2HttpMessageConverter#canWrite
解析Spring RestTemplate必需搭配MultiValueMap的理由-8.jpg

可见,当使用的 Body 为 HashMap,是可完成 JSON 序列化的。
所以后续将这个表单序列化为恳求 Body了。
但我还是疑问,为何适应表单处置的编解码器不行?
那就该看编解码器判断是否支持的实现:
FormHttpMessageConverter#canWrite
解析Spring RestTemplate必需搭配MultiValueMap的理由-9.jpg

可见只要当我们发送的 Body 是 MultiValueMap 才干使用表单来提交。
原来使用 RestTemplate 提交表单必需是 MultiValueMap!
而我们案例定义的就是普通的 HashMap,最终是按恳求 Body 的方式发送进来的。
修正

换成 MultiValueMap 类型存储表单数据即可:
解析Spring RestTemplate必需搭配MultiValueMap的理由-10.jpg

修正后,表单数据最终使用下面的代码停止了编码:
FormHttpMessageConverter#write
解析Spring RestTemplate必需搭配MultiValueMap的理由-11.jpg

发送出的数据截图如下:
解析Spring RestTemplate必需搭配MultiValueMap的理由-12.jpg

这就对了!其实官方文档也说明了:
解析Spring RestTemplate必需搭配MultiValueMap的理由-13.jpg

参考:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
到此这篇关于解析Spring RestTemplate必需搭配MultiValueMap的理由的文章就介绍到这了,更多相关Spring RestTemplate MultiValueMap内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

二了吧唧
注册会员
主题 21
回复 24
粉丝 0
|网站地图
快速回复 返回顶部 返回列表