微服务之间的大多都是使用 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?相关推荐

  1. Spring RestTemplate中文乱码解决方案

    Spring RestTemplate中文乱码解决方案 参考文章: (1)Spring RestTemplate中文乱码解决方案 (2)https://www.cnblogs.com/accesski ...

  2. java 获取400的错误信息_获取400错误的请求Spring RestTemplate POST

    我想使用POST方法使用Spring Rest web服务.我无法在客户端(网站)访问POJO文件,因此必须在客户端使用JSON并在Web服务中使用POJO.下面是我的代码:获取400错误的请求Spr ...

  3. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...

  4. 具有链接资源的Spring RestTemplate

    Spring Data REST是一个了不起的项目,它提供了一些机制来将基于Spring Data的存储库中的资源公开为REST资源. 使用链接资源公开服务 考虑两个简单的基于JPA的实体,课程和教师 ...

  5. 使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务

    Spring-hateoas为应用程序创建遵循HATEOAS原理的基于REST的服务提供了一种极好的方法. 我的目的不是要展示如何创建服务本身,而是要展示如何将客户端写入服务. 我将要使用的示例服务是 ...

  6. spring RestTemplate用法详解

    spring RestTemplate用法详解 spring 3.2.3 框架参考有说明 21.9 Accessing RESTful services on the Client 转载于:https ...

  7. Spring RestTemplate示例

    Spring RestTemplate示例 Spring RestTemplate提供了一种测试RESTful Web服务的便捷方式. 目录[ 隐藏 ] 1 Spring RestTemplate 1 ...

  8. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务

    在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...

  9. Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header

    Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header { "Author": & ...

最新文章

  1. JAVA基础----java中E,T,?的区别?
  2. c语言switch虚线,有以下程序:include<stdio.h>main(){int c;while((c=getchar())!='\n')switch(c-'2'){case 1:pu...
  3. Codeforces Round #486 (Div. 3) C Equal Sums (map+pair)
  4. 从头编写 asp.net core 2.0 web api 基础框架 (2)
  5. tcp 测试软件,ztcp
  6. 数据用压缩 bcd 码 java_IT职场新人选python,go还是java?用数据来说话
  7. Hi3519V101 Uboot和Kernel编译
  8. 艾伟:微软是在向谁“献刀”
  9. 目前最新传智播客郭永锋最新工作室2018Java培训项目实战(完整)
  10. 批量调取接口_调用API接口批量查手机归属地
  11. 状态压缩.种花小游戏
  12. 上海php程序员职友集,好程序员WEB前端培训|HTML5培训|H5培训-好程序员官网
  13. C语言read和write函数解析
  14. 系统间通信:网络I/O模型
  15. 河城荷取 二分答案 最大流
  16. 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
  17. Java IO流源码学习之二(Buffered字节流)
  18. 初学C语言(时间2022.11.7)
  19. Web应用中基于密码的身份认证机制(表单认证、HTTP认证: Basic、Digest、Mutual)
  20. 欧姆龙PLC项目程序NJ系列模切机程序

热门文章

  1. 持续集成(三)- hudson插件入门
  2. 【Python码住雪景小程序】雪景人像最强攻略:让你一下美10倍、美醉了(中国人不骗中国人)
  3. 长尾分布之DECOUPLING REPRESENTATION AND CLASSIFIER FOR LONG-TAILED RECOGNITION
  4. openGauss 2.0.0 版本正式发布
  5. 分治法之图解最大子序列和
  6. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第二十集
  7. SAP ABC作业成本法
  8. Coursera课程答案分享
  9. scrapy爬取优信二手车
  10. 优信二手车数据可视化