restTemplate请求不通的问题

文章讲述了开发者在使用Spring的RestTemplate进行接口GET请求时遇到的问题,由于参数已URLEncoder编码,RestTemplate再次编码导致URL不正确。解决方法包括使用URI对象、避免预编码URL或考虑更换其他HTTP框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      学艺不精。最近调试接口的时候,遇到一个问题,接口get请求,传递一个参数unitId,但参数要求进行URLEncoder进行编码,在组装完url后使用RestTemplate进行接口请求,无论如何都无法正常请求到。而接口使用postman等能正常请求,后调整代码使用httpclient也能正常访问。故查找restTemplate访问不通的原因。

        结论为:restTemplate在请求是自动对url中的特殊字符进行了一次编码,而原url拼接时已经进行了编码,故发送到服务方的url编码不正确了。

        以下转载内容:

        转载:使用RestTemplate遇到的问题_resttemplate不能用了?-优快云博客

问题描述:
1、在使用restTemplate调用外部提供的接口时,怎么调也成功不了(对方返回-9,具体原因未知,可以确定的是走到方法里面了,该接口有些特殊:虽然用的post请求,但是请求参数组装到了url上,类似http://127.0.0.1:8080/xx?info=<123>1</123>);
2、地址已经先被我转义过了,在调用URLEncoder.encode(url)方法;
3、调用 RestTemplate public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)方法。

代码如下:

分析:
通过打断点,发现在走到RestTemplate#execute(String url,...)方法:
走到

URI expanded = this.getUriTemplateHandler().expand(url, uriVariables);

代码的时候,url特殊字符会转义,所以导致我发送的url和接口提供方的收到的url不一致。

原因:因为我之前已经用URLEncoder.encode(url)处理过了,而我再调用RestTemplate#postForObject(String url,...)时,它会再转义一遍,导致url发生了变化。

解决方法:

1.新建URI,RestTemplate public <T> T postForObject(URI uri, @Nullable Object request, Class<T> responseType, Object... uriVariables)方法。

2.不转义地址,直接调用RestTemplate public <T> T postForObject(String url,...)方法,使用与可以自己控制是否含有特殊字符的代码

3.不用RestTemplate,改用别的http框架也可以解决问题(不推荐) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值