使用RestTemplate在代码内调用POST请求的参数乱码问题
背景:在项目A代码内部,调用项目B的restful接口C,我们采用了RestTemplate进行调用,但是调用过程中,一直不能正常返回数据,日志显示参数存在乱码(有个参数的值是中文)
乱码原因:请求方式是POST,但是我们把参数都放在了url的?后面,参数传递形式与GET请求一样!!!
由于请求方式是POST,所以需要将参数放在body里面进行传递,并且参数需要用MultiValueMap结构体装载,如下所示(RestTemplate的调用改为如下就好了):
方式一:
if (method == HttpMethod.POST) {
MultiValueMap<String, Object> postParameters = new LinkedMultiValueMap<>();
map.forEach((k, v) -> {
postParameters.add(k, v.toString());
});
return JSON.parseObject(restTemplate.postForObject(url, postParameters, String.class));
}
方式二:
postParam: post请求时body里面的参数
url: 含url后跟的其他参数
restTemplate.postForObject(url.toString(), new HttpEntity<>(postParam), String.class);
注意,在启动类里加载restTemplate时,需要设置为UTF-8
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate;
}
方式三:
适合于 url 后面既有 param 又有 body 的 post 请求
public void testPostRestTemplate() {
String url = "http://localhost:9999/xxx/xxx";
// url 后面的 param 参数,即 url 问号后面的参数信息
Map<String, Object> urlMap = new HashMap<>(5);
urlMap.put("urlKey1", "urlValue1");
urlMap.put("urlKey2", "urlValue2");
urlMap.put("urlKey3", "urlValue3");
urlMap.put("urlKey4", "urlValue4");
urlMap.put("urlKey5", "urlValue5");
// 将 param 参数追加到 url 后面
StringBuilder sb = new StringBuilder(url);
if (!CollectionUtils.isEmpty(urlMap)) {
sb.append("?");
urlMap.forEach((k, v) -> {
sb.append(k).append("=").append(v).append("&");
});
sb.deleteCharAt(sb.length() - 1);
}
// post 请求里面的 body 内容
Map<String, String> bodyMap = new HashMap<>();
bodyMap.put("bodyKey1", "bodyValue1");
// 设置 headers
HttpHeaders httpHeaders = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
httpHeaders.setContentType(type);
HttpEntity<Map<String, Object>> objectHttpEntity = new HttpEntity(bodyMap, httpHeaders);
ResponseEntity<Object> responseResultResponseEntity = restTemplate.postForEntity(sb.toString(), objectHttpEntity, Object.class);
Object res = responseResultResponseEntity.getBody();
System.out.println(res);
}
使用RestTemplate在代码内调用POST请求的参数乱码问题的更多相关文章
- tomcat解决GET请求中文参数乱码
通常,在使用Spring MVC框架的应用程序中,为了解决中文参数乱码的问题,都会添加如下过滤器配置: <filter> <filter-name>encodingFilter ...
- post和get请求的参数乱码
对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考 ...
- POST、GET请求中文参数乱码问题
POST请求中文乱码问题解决方法: 在web.xml文件中添加编码过滤器,如下: <!-- 解决post乱码 --> <filter> <filter-name>C ...
- 【java】httpclient的使用之java代码内发送http请求
场景: 需要本项目发送HTTP请求到另一个项目中,处理完成返回值给本项目. 1.本项目引入架包 <!-- httpclient 后台发送http请求--> <dependency&g ...
- 解决Delphi的Indy10组件包TIdHttpServer控件解码HTTP请求时参数乱码的问题
Delphi6下使用Indy10组件包,其中的TIdHttpServer控件在处理HTTP请求的时候 不能正确解码含有汉字的参数,如: http://127.0.0.1/test?cmd=open&a ...
- Tomcat get请求中文参数乱码
场景:使用Tomcat容器进行get方式传递中文参数到后台乱码. 原因:Tomcat默认的编码方式是ISO--. 解决方案: . 设置cofg-server.xml中的<Connector> ...
- java调用Http请求 -HttpURLConnection学习
最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放 ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
随机推荐
- Hadoop Mapreduce 案例 wordcount+统计手机流量使用情况
mapreduce设计思想 概念:它是一个分布式并行计算的应用框架它提供相应简单的api模型,我们只需按照这些模型规则编写程序,即可实现"分布式并行计算"的功能. 案例一:word ...
- C#:memcached安装及.NET中的Memcached.ClientLibrary使用详解
memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法. 下载地址:http://pan.baidu.com/s/1yVILw 提取 ...
- Spring Cloud Zuul 快速入门
Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...
- elasticsearch 聚合函数 max double精度损失bug
测试样例数据{ "size" : 0, "query" : { "bool" : { "must" : { " ...
- Quartz定时任务详解一
以下是我在应用的的一个基本配置: #---------调度器属性---------------- org.quartz.scheduler.instanceName = TestScheduler o ...
- Kafka研究【一】:bring up环境
kafka是干什么的,有和特性,我这里就不多说,详情自己研究官方文档. 0. 背景介绍 我需要在三台机器上分别部署kafka broker的实例,构建成一个集群.kafka的broker集群,是基于z ...
- VUEX 学习
语法 翻译 功能介绍 module(模块)extend(扩展)extract(提取)export(输出)router(路由器)components(组件) store(储存)state (声明. ...
- html框内文字垂直居中的方法
由于无法知道框内文字的高度,很难确定垂直空间的位置.vertical-align:middle仅对td元素有效,无论单行和多行均可实现垂直居中.
- 服务链路追踪(Spring Cloud Sleuth)
sleuth:英 [slu:θ] 美 [sluθ] n.足迹,警犬,侦探vi.做侦探 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的 ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...