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

Springboot使用RestTemplate发送Post请求postForEntity (application/x-www-form-urlencoded) Springboot使用RestTemplate发送Post请求postForEntity[application/x-www-form-urlencoded] 背景思路正文ServiceRestTemplate 使用 postForEntity 请求接口基于xml系列注解解析XML返回值XML的一些基本常识实体类与xml文件对应实体代码参考博客 背景 对接请求为(application/x-www-form-urlencoded),返回XML格式接口。 思路 ServiceRestTemplate 使用 阅读详情
AI摘要

本文介绍了使用Spring的RestTemplate工具类发送POST请求时如何正确地传递参数。详细阐述了不同类型的Map对于参数传递的影响,并提供了正确的代码示例。

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

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

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

Map<String, Object> paramMap = new HashMap<String, Object>();
Map<String, Object> paramMap = new LinkedHashMap<String, Object>();

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

MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();

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

public static void main(String[] args) {
        RestTemplate template = new RestTemplate();
        String url = "http://192.168.2.40:8081/channel/channelHourData/getHourNewUserData";
        // 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
        paramMap.add("dt", "20180416");

        // 1、使用postForObject请求接口
        String result = template.postForObject(url, paramMap, String.class);
        System.out.println("result1==================" + result);

        // 2、使用postForEntity请求接口
        HttpHeaders headers = new HttpHeaders();
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
        ResponseEntity<String> response2 = template.postForEntity(url, httpEntity, String.class);
        System.out.println("result2====================" + response2.getBody());

        // 3、使用exchange请求接口
        ResponseEntity<String> 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<String, Object> paramMap = new HashMap<String, Object>();
	paramMap.put("dt", "20181116");
	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<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(null,headers);
	ResponseEntity<String> response2 = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap);
	System.out.println("result2====================" + response2.getBody());
}

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

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

 

微服务架构整理-(七、SpringCloud实战之RestTemplate) 针对远程API,RestTemplate提供了GET,POST,PUT,DELETE四种请求,通过这些请求可以很轻松的访问远程服务。 阅读详情

相关推荐

精讲RestTemplate-POST请求方法使用详解

前言: 其实POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法: postForObject() postForEntity() 二者的主要区别在于,postForObject()返回值是HTTP协议的响应体。postForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。 一、post

m0_45270667的博客 1万+

详细解析rest风格的请求方式1

前言:rest请求封装了很多api,满足各种请求方式以及参数的传递,包含post、get请求方式,丰富的请求方法。 post:postForObject、postForEntity、postForLocation get:getForObject、getForEntity 当然每种请求方法都有不同的重载方法,满足大家不同的参数传递。 今天为大家讲解post请求方式中postForObject的用法以及get请求方式中的getForObject方法。 一、postForObject方法 1.1postFo.

qq_43380361的博客 2154

Cocos Creator Android打包:NDK版本选择与配置全攻略

在Android原生开发中,NDK(Native Development Kit)是编译C/C++代码的核心工具链,它决定了代码如何被编译为不同CPU架构(如ARMv7、ARM64)的动态库。其工作原理在于提供了一套完整的交叉编译环境,将高级语言代码转化为设备可执行的二进制指令。这一技术对于游戏引擎和性能敏感型应用至关重要,因为它能直接调用硬件资源,提升运行效率。在实际工程中,NDK版本必须与Android Gradle插件(AGP)版本、项目依赖的C++标准库精密匹配,否则会导致编译失败或运行时崩溃。特别

weixin_33725270的博客 490

Springboot使用RestTemplate发送Post请求postForEntity (application/json)的坑

当使用RestTemplate进行http请求时,的确很方便,但是当需要进行post请求时遇到了坑 1POST传递参数 :采用 LinkedMultiValueMap ,不能使用HashMap String url = 'http://posturl'; MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>(); map.add("shopid",".

anita9999的博客 1万+

5.44GHz超高精度!STM32G474的HRTIM时钟配置避坑指南

本文深入解析STM32G474内置高分辨率定时器的时钟配置要点,帮助工程师避开常见陷阱。文章详细阐述了从系统时钟到5.44GHz等效时基的路径,重点分析了预分频器乘法器、周期计算溢出、影子寄存器同步等关键配置,并结合实测波形对比,确保HRTIM在电机控制、数字电源等精密应用中发挥极限性能。

book8的博客 522

oracle rac 成本及架构,Oracle Extended RAC 架构实战

Extended-RAC,是RAC技术的一种扩展增强。Extended-RAC是通过专用光纤(或租用裸光纤)加DWDM(波分设备)设备将两个不同楼栋/同城甚至异地机房进行相连,将数据库主机、存储分别放置于不同机房,利用存储复制/ASM Mirror等技术进行数据复制进行搭建的一种远距离集群架构。Extended RAC需要将不同楼栋/同城甚至异地机房通过专用光纤(或租用裸光纤)加DWDM(光纤复用...

weixin_33812391的博客 2453

Java RestTemplate post请求传递参数遇到的坑

转自: https://blog.youkuaiyun.com/LDY1016/article/details/80002126 最近使用Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑,也就是当我们把参数封装在Map里面的时候,Map 的类型选择。 使用RestTemplate post请求的时候主要可以通过三种方式实现 1、调用postForObject方...

u012556408的博客 7237

INCA刷写App文件必看:A2l文件配置与ProF文件安装详解(2023最新版)

本文深入解析了使用INCA进行ECU应用程序刷写时,A2l文件配置与ProF文件安装的关键细节与避坑指南。重点阐述了A2l文件必须与待刷写二进制文件严格匹配的核心逻辑,以及ProF文件与Bootloader版本强相关的安装策略,帮助开发者解决刷写过程中的常见失败问题,确保刷写流程的稳定与可靠。

milk8的博客 590

Java RestTemplate post请求传递参数

使用RestTemplate post请求的时候主要可以通过三种方式实现 1、调用postForObject方法 2、使用postForEntity方法3、调用exchange方法 postForObject和postForEntity方法的区别主要在于可以在postForEntity方法中设置header的属性,当需要指定header的属性值的时候,使用postForEntity方法。exchange方法和postForEntity类似,但是更灵活,exchange还可以调用get...

qq_38422016的博客 1万+

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1314

Cosmos Transfer2.5多模态AI模型部署与优化实战

多模态AI技术通过融合文本、图像、代码等不同模态数据,实现跨模态理解与生成。其核心原理基于Transformer架构的注意力机制,结合对比学习实现模态对齐。这类技术在智能内容创作、跨模态搜索等领域具有重要价值,尤其适合电商营销图文生成、UI设计转代码等场景。Cosmos Transfer2.5作为先进的多模态模型,支持8192 tokens长文本窗口和混合模态输入,实测推理速度达17.5 samples/s(T4显卡)。部署时需注意FlashAttention优化可提升3倍长文本处理效率,8-bit量化则能

weixin_29038303的博客 280

RestTemplate发送带body参数的post请求

在一般的http请求中,post请求是一个绕不过的方法类型,主要是这类请求,可以传输更多更大的参数,甚至是文件。 一般的参数是属于键值对形式,这种普通的参数每一个都有各自的名字和值,这是最简单的form表单形式,后端在取值的时候,需要根据一个一个参数名来获取参数值。 还有一种参数是以body请求体方式传递到后台的,一般可以是一个数组,也可以是一个对象,当作为一个对象的时候,需要封装为json格式,后台就通过一个对象来接收,而不用一个一个参数名来接收所有的参数。这个时候,我们后台代...

feinifi的博客 1万+

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1544

SpringBoot ——— 使用RestTemplate发送带token的GET和POST请求

最近要在项目中调用别人提供的接口服务,网上大概搜了一下,发现除了传统的httpclient之外,Spring也为我们提供了一个非常方便的HTTP客户端,允许我们调用各种rest服务,包括GET,POST,PUT,DELETE等等。折腾了一下发现还挺好用的,下面贴出RestTemplate发送GET和POST的示例代码。 配置类: package com.test.config; import...

Die Another Day! 2万+

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java RestTemplate远程调用传递参数

Java RestTemplate远程调用传递参数 最近使用Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑,也就是当我们把参数封装在Map里面的时候,Map 的类型选择。 使用RestTemplate post请求的时候主要可以通过三种方式实现 调用postForObject方法 使用postForEntity方法 调用exchange方法 postForObject和postForEntity方法的区别主要在于: 可以在postForEntity方法中设置head

GuessHat的博客 2203

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java rest post 参数_Java RestTemplate post请求传递参数遇到的坑

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

weixin_29342901的博客 825

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RestTemplate 发送Post 多个参数请求

        MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>(); requestEntity.add("clientFlag", clientFlag); requestEntity....

agg7911的博客 3793

rest java接post不通,Java RestTemplate post请求传递参数遇到的坑

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

weixin_36192634的博客 652

RestTemplate发起POST请求,json参数小坑

原来的代码 public JSONObject temlateUtil(MultiValueMap<String, String> params,String pathUrl){ RestTemplate restTemplate = new RestTemplate(); String url = String.format(pathUrl); ...

qq_34002000的博客 7753

RestTemplate发送Post请求报错:414 URI Too Long

RestTemplate发送Post请求报错:414 URI Too Long

weixin_49114503的博客 991

springboot 项目使用restTemplate 发post请求 参数封装

restTemplate 发post请求 参数封装不同的请求头,参数的封装类不一样 不同的请求头,参数的封装类不一样 RestTemplate 的配置类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import

peter_ou的博客 2844
上一篇: java格式化CST日期时间(包含英文和中文两种格式的CST时间)
下一篇: SpringBoot中使用mybatis-generator自动生成代码
咚咚阳丶
博客等级 码龄15年 1968粉丝 91原创
评论 57
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值