springboot 整合 RestTemplate 与 使用方法

RestTemplate 的 postForObject 方法有四个参数

  • String url => 顾名思义 这个参数是请求的url路径
  • Object request => 请求的body 这个参数需要再controller类用 @RequestBody 注解接收
  • Class<T> responseType => 接收响应体的类型
  • ------------ 第四个参数 postForObject 方法多种重构
  • Map<String,?> uriVariables => uri 变量 顾名思义 这是放置变量的地方
  • Object... uriVariables => 可变长 Object 类型 参数

首先我们使用最简单的一种 可变长Object 参数 进行传值

@Service
public class HelloService { @Autowired
RestTemplate restTemplate; public String helloService(String name,Integer age){
return restTemplate.postForObject("http://SERVICE-HELLO/hello?name={name}&age={age}", null, String.class, name,age);
}
}

需要再url上拼接参数并使用{参数名}占位符站位

然后将参数放到 第四个参数 可变长 Object 参数上 即可

Controller类代码

@RestController
public class DemoController {
@Value("${server.port}")
String port; @PostMapping("hello")
public String home(String name,Integer age){
return "hello " + name + " you age is " + age + " ,i am from port:" + port;
}
}

测试

返回成功

接下来我们使用 Map传值

    public String helloService(String name,Integer age){
Map<String,Object> map = new HashMap<>();
map.put("name",name);
map.put("age",age);
return restTemplate.postForObject("http://SERVICE-HELLO/hello?name={name}&age={age}", null, String.class, map);
}

只需要将参数放入到map中即可

那有些人要问了 , 为什么不能用 第二个 request 参数传值 , 其实是可以的

我试过用HashMap 和 LinkedHashMap 都是接收不到的

所以我们来看一下源码是怎么写的

首先进入到 postForObject 方法中 发现request 参数 传入了一个 httpEntityCallBack 方法中 , 那么接着追踪

进入httpEntityCallBack方法中

httpEntityCallBack方法又调用了 RestTemplate的HttpEntityRequestCallback方法

进入HttpEntityRequestCallback

这里会出现一个分支 instanceof 类型判定 requestBody 参数是否是 HttpEntity类型

如果不是则 创建一个HttpEntity类将 requestBody 参数传入

那么我们来看一下 HttpEntity 是怎么个构造

这里可以看到 HttpEntity 有两个构造方法 一个是 传入 泛型的body 另一个是传入 MultiValueMap<String,String> headers

那么 这个MultiValueMap 是个什么东东

百度一下 发现 MultiValueMap 可以让一个key对应多个value,感觉是value产生了链表结构,可以很好的解决一些不好处理的字符串问题

找到 MultiValueMap 接口的实现类

这里我们使用 LinkedMultiValueMap

    public String helloService(String name,Integer age){
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("name",name);
paramMap.add("age", age);
return restTemplate.postForObject("http://SERVICE-HELLO/hello",paramMap,String.class);
}

Controller代码

public class DemoController {

    @Value("${server.port}")
String port; @PostMapping("hello")
public String home(String name,Integer age){
return "MultiValueMap : hello " + name + " you age is " + age + " ,i am from port:" + port;
}
}

测试

返回值正确 操作成功

RestTemplate post请求 Controller 接收不到值的解决方案 postForObject方法源码解析的更多相关文章

  1. RestTemplate post请求使用map传参 Controller 接收不到值的解决方案 postForObject方法源码解析.md

    结论 post方法中如果使用map传参,需要使用MultiValueMap来传递 RestTemplate 的 postForObject 方法有四个参数 String url => 顾名思义 ...

  2. MapReduce中一次reduce方法的调用中key的值不断变化分析及源码解析

    摘要:mapreduce中执行reduce(KEYIN key, Iterable<VALUEIN> values, Context context),调用一次reduce方法,迭代val ...

  3. iOS网络请求-AFNetworking源码解析

    趁着端午节日,自己没有什么过多的安排,准备花4-5天左右,针对网络请求源码AFNetworking和YTKNetwork进行解析以及这两年多iOS实际开发经验(其实YTKNetwork也是对AFNet ...

  4. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  5. Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析

    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...

  6. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  7. Flask之 请求,应用 上下文源码解析

    什么是上下文? 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行,就要给所有的外部变量一个一个写 ...

  8. Thinkphp6源码分析之解析,Thinkphp6路由,Thinkphp6路由源码解析,Thinkphp6请求流程解析,Thinkphp6源码

    Thinkphp6源码解析之分析 路由篇-请求流程 0x00 前言: 第一次写这么长的博客,所以可能排版啊,分析啊,什么的可能会比较乱.但是我大致的流程已经觉得是说的够清楚了.几乎是每行源码上都有注释 ...

  9. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

随机推荐

  1. C语言内存:大端小端及判别方式

    大端和小端是指数据在内存中的存储模式,它由 CPU 决定:1) 大端模式(Big-endian)是指将数据的低位(比如 1234 中的 34 就是低位)放在内存的高地址上,而数据的高位(比如 1234 ...

  2. C++11 左值引用和右值引用与引用折叠和完美转发

    1.左值与右值 最感性的认识. 当然,左值也是可以在右边的. 左值是可以被修改的,右值不能. 当然取地址也是. 生存周期一般左值会比右值的长,一般右值都计算时产生的无名临时对象,存在时间比较短. 下面 ...

  3. iOS 15 Beta升级卡死在更新进程,无法启动怎么办?

    2021苹果全球开发者大会结束后,大批果粉迫不及待的尝试升级iOS 15测试版本,想第一时间体验新功能. 但是许多用户反馈升级一直卡死在"准备更新"."验证更新" ...

  4. 每天五分钟Go - 数组

    //数组的声明,默认为0值 var a1 [2]int fmt.Println(a1) //数组的长度 fmt.Println(len(a1)) //遍历数组 for i, v := range a1 ...

  5. dva的effect那么难用,自己造一个轮子吧

    背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...

  6. c语言学习篇二【基础语法】

    一.定义常量: 使用 #define 预处理器. 使用 const 关键字. #include <stdio.h> int main() { const int LENGTH = 10;/ ...

  7. 每日三道面试题,通往自由的道路14——MySQL

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天我们是不是聊到了锁,而你提到了MySQL? ...

  8. springmvc学习指南 之---第25篇 Spring Bean有三种配置方式

    writed by不要张艳涛, 从tomcat转到了springmvc 现在开始有点不知道该看什么书了,看完了springmvc 学习指南之后 又查了一些书,好多都是内容相近,在找书的过程之中,发现s ...

  9. vue点击复制功能

    复制功能,选中复制或者点击复制(不使用插件的情况下) 1.选中复制 这个比点击复制简单点 <template>   <div>     <el-button type=& ...

  10. C# MongoDB添加索引

    场景: 在最近的项目中,用到了Mongodb,用它来保存大量工业数据.同时是会根据用户自动建立对应的数据表.这要求同时建立索引来加快查询. 解决: 1.在Nuget包中查询"mongocsh ...