Java RestTemplate post请求传递参数遇到的坑(后端表单方式接收参数)

Java RestTemplate post请求传递参数遇到的坑(后端表单方式接收参数)最近使用 Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑 也就是当我们把参数封装在 Map 里面的时候 Map 的类型选择 使用 RestTemplate 请求的时候主要可以通过三种方式实现 1 调用 postForObjec 方法 2 使用 postForEntit 方法 3 调用 exchange 方法 postForObjec 和

    最近使用Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑,也就是当我们把参数封装在Map里面的时候,Map 的类型选择。 使用RestTemplate post请求的时候主要可以通过三种方式实现

    1、调用postForObject方法  2、使用postForEntity方法 3、调用exchange方法

    postForObjectpostForEntity方法的区别主要在于可以在postForEntity方法中设置header的属性,当需要指定header的属性值的时候,使用postForEntity方法exchange方法和postForEntity类似,但是更灵活,exchange还可以调用get、put、delete请求。使用这三种方法调用post请求传递参数,当接口是表单接收参数的时候,Map不能定义为以下两种类型(url使用占位符进行参数传递时除外),HashMap是以请求体传递,MultiValueMap是表单传递!

Map 
  
    paramMap = new HashMap 
   
     (); 
    
  
Map 
  
    paramMap = new LinkedHashMap 
   
     (); 
    
  

   经过测试,我发现这两种map里面的参数都不能被后台接收到,这个问题困扰我两天,终于,当我把Map类型换成LinkedMultiValueMap后,参数成功传递到后台

MultiValueMap 
  
    paramMap = new LinkedMultiValueMap 
   
     (); 
    
  

    经过测试,正确的传参方式如下

public static void main(String[] args) {         RestTemplate template = new RestTemplate();         String url = "http://192.168.2.40:8081/channel/channelHourData/getHourNewUserData";         // 封装参数,千万不要替换为Map与HashMap,否则参数无法传递         MultiValueMap 
  
    paramMap = new LinkedMultiValueMap 
   
     ();         paramMap.add("dt", "");         // 1、使用postForObject请求接口         String result = template.postForObject(url, paramMap, String.class);         System.out.println("result1==================" + result);         // 2、使用postForEntity请求接口         HttpHeaders headers = new HttpHeaders();         HttpEntity 
    
      > httpEntity = new HttpEntity 
     
       >(paramMap,headers);         ResponseEntity 
      
        response2 = template.postForEntity(url, httpEntity, String.class);         System.out.println("result2====================" + response2.getBody());         // 3、使用exchange请求接口         ResponseEntity 
       
         response3 = template.exchange(url, HttpMethod.POST, httpEntity, String.class);         System.out.println("result3====================" + response3.getBody()); } 
        
       
      
     
    
  

GET方式传参说明

如果是get请求,又想要把参数封装到map里面进行传递的话,Map需要使用HashMap,且url需要使用占位符,如下:

public static void main(String[] args) { RestTemplate restTemplate2 = new RestTemplate(); String url = "http://127.0.0.1:8081/interact/getData?dt={dt}&ht={ht}"; // 封装参数,这里是HashMap Map 
  
    paramMap = new HashMap 
   
     (); paramMap.put("dt", ""); paramMap.put("ht", "10"); //1、使用getForObject请求接口 String result1 = template.getForObject(url, String.class, paramMap); System.out.println("result1====================" + result1); //2、使用exchange请求接口 HttpHeaders headers = new HttpHeaders(); headers.set("id", "lidy"); HttpEntity 
    
      > httpEntity = new HttpEntity 
     
       >(null,headers); ResponseEntity 
      
        response2 = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap); System.out.println("result2====================" + response2.getBody()); } 
       
      
     
    
  

ps:post请求也可以通过占位符的方式进行传参(类似get),但是看起来不优雅,推荐使用文中的方式

补充:使用RestTemplate调用delete、put请求请参考我的另一篇文章:https://blog.csdn.net/LDY1016/article/details/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212266.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午8:26
下一篇 2026年3月18日 下午8:26


相关推荐

  • PCL 基于B样条曲线的曲面重建「建议收藏」

    PCL 基于B样条曲线的曲面重建「建议收藏」基于B样条曲线的曲面重建

    2022年6月18日
    58
  • 什么是用户态和内核态的区别_内核态和用户态的概念

    什么是用户态和内核态的区别_内核态和用户态的概念什么是用户态和内核态从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。为什么要区分内核态和用户态往往我们的系统的资源是

    2025年12月5日
    6
  • Java 面试之 IO 流及Socket

    Java 面试之 IO 流及SocketJava 面试之 IO 流及Socket

    2022年4月22日
    38
  • Linux下利用python实现语音识别详细教程

    Linux下python实现语音识别详细教程语音识别工作原理简介选择合适的python语音识别包安装SpeechRecognition识别器类音频文件的使用英文的语音识别噪音对语音识别的影响麦克风的使用中文的语音识别小范围中文识别语音合成网关于语音识别的教程很多都是关于调用第三方平台的API实现,而这片文章用的是PocketSphinx进行的,小范围的语音识别绝对够用

    2022年4月7日
    139
  • Java爬虫系列一:写在开始前[通俗易懂]

    最近在研究Java爬虫,小有收获,打算一边学一边跟大家分享下,在干货开始前想先跟大家啰嗦几句。一、首先说下为什么要研究Java爬虫Python已经火了很久了,它功能强大,其中很擅长的一个就是写爬虫

    2022年2月16日
    42
  • lrc格式说明

    lrc格式说明ar 艺人名 ti 曲名 al 专辑名 by 本歌词编辑者 offset 时间补偿值 单位 毫秒 正值表示整体提前 负值相反 用于调整总体快慢 key 加密后的编码 由编辑器自行加入 分钟 秒钟 02 12 54 05 12 54 08 12 54 nbsp Thisisagoodl 10 25 12 你是谁啊 15 25 12 10 25 12 你是谁啊时间轴每行可以有多个 表示当前行右侧的歌词内容在多个时间段出现

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号