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

 更新时间:2021年11月25日 16:28:26   作者:chenzk的博客  
本文给大家介绍Spring RestTemplate必须搭配MultiValueMap的理由,本文通过实例图文相结合给大家介绍的非常详细,需要的朋友参考下吧

什么是REST?

  REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格的名词。REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web 服务,包括使用不同语言编写的客户端如何通过 HTTP处理和传输资源状态。

微服务之间的大多都是使用 HTTP 通信,这自然少不了使用 HttpClient。
在不适用 Spring 前,一般使用 Apache HttpClient 和 Ok HttpClient 等,而一旦引入 Spring,就有了更好选择 - RestTemplate。

接口:

想接受一个 Form 表单请求,读取表单定义的两个参数 para1 和 para2,然后作为响应返回给客户端。

定义完接口后,使用 RestTemplate 来发送一个这样的表单请求,代码示例如下:

上述代码定义了一个 Map,包含了 2 个表单参数,然后使用 RestTemplate 的 postForObject 提交这个表单。
执行代码提示 400 错误,即请求出错:

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

解析

RestTemplate 提交的表单,最后提交请求啥样?
Wireshark 抓包:

实际上是将定义的表单数据以 JSON 提交过去了,所以我们的接口处理自然取不到任何表单参数。
why?怎么变成 JSON 请求体提交数据呢?注意 RestTemplate 执行调用栈:

最终使用的 Jackson 工具序列化了表单

用到 JSON 的关键原因在

RestTemplate.HttpEntityRequestCallback#doWithRequest

根据当前要提交的 Body 内容,遍历当前支持的所有编解码器:

若找到合适编解码器,用之完成 Body 转化

看下 JSON 的编解码器对是否合适的判断

AbstractJackson2HttpMessageConverter#canWrite

可见,当使用的 Body 为 HashMap,是可完成 JSON 序列化的。
所以后续将这个表单序列化为请求 Body了。

但我还是疑问,为何适应表单处理的编解码器不行?
那就该看编解码器判断是否支持的实现:

FormHttpMessageConverter#canWrite

可见只有当我们发送的 Body 是 MultiValueMap 才能使用表单来提交。
原来使用 RestTemplate 提交表单必须是 MultiValueMap!
而我们案例定义的就是普通的 HashMap,最终是按请求 Body 的方式发送出去的。

修正

换成 MultiValueMap 类型存储表单数据即可:

修正后,表单数据最终使用下面的代码进行了编码:

FormHttpMessageConverter#write

发送出的数据截图如下:

这就对了!其实官方文档也说明了:

参考:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

到此这篇关于解析Spring RestTemplate必须搭配MultiValueMap的理由的文章就介绍到这了,更多相关Spring RestTemplate MultiValueMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现人机猜拳游戏

    Java实现人机猜拳游戏

    这篇文章主要为大家详细介绍了Java实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Java文件基本操作总结

    Java文件基本操作总结

    今天给大家带来的是关于Java基础的相关知识,文章围绕着Java文件操作展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • hadoop 单机安装配置教程

    hadoop 单机安装配置教程

    单机安装主要用于程序逻辑调试。安装步骤基本通分布式安装,包括环境变量,主要Hadoop配置文件,SSH配置等,需要的朋友可以参考下
    2012-11-11
  • java字符串中提取数字的方法

    java字符串中提取数字的方法

    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • idea启动springmvc项目时报找不到类的解决方法

    idea启动springmvc项目时报找不到类的解决方法

    这篇文章主要介绍了idea启动springmvc项目时报找不到类的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring注入Map集合实现策略模式详解

    Spring注入Map集合实现策略模式详解

    这篇文章主要介绍了Spring注入Map集合实现策略模式详解,Spring提供通过@Resource注解将相同类型的对象注入到Map集合,并将对象的名字作为key,对象作为value封装进入Map,需要的朋友可以参考下
    2023-11-11
  • Java中的==使用方法详解

    Java中的==使用方法详解

    这篇文章主要给大家介绍了关于Java中的==使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • Java控制台实现猜拳游戏

    Java控制台实现猜拳游戏

    这篇文章主要为大家详细介绍了Java控制台实现猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Java CountDownLatch应用场景代码实例

    Java CountDownLatch应用场景代码实例

    这篇文章主要介绍了Java CountDownLatch应用场景代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java.lang.OutOfMemoryError: Metaspace异常解决的方法

    java.lang.OutOfMemoryError: Metaspace异常解决的方法

    这篇文章主要介绍了java.lang.OutOfMemoryError: Metaspace异常解决的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论