postTemplate 发送的httpEntity格式和响应数据出现中文乱码问题
项目中有个地方需要请求第三方接口的数据,接口规定了post方法和对象头,打算采用RestTemplate的postForEntity方法获取数据,但是在添加请求体的时候就出问题了。(项目用的是java11)
首先查看一下postForEntity的源码:
public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {RequestCallback requestCallback = this.httpEntityCallback(request, responseType);ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor));}
发现传参第二项是object类的请求数据,但是查看网上的教程都是用一个带泛型的HttpEntity类型传递的请求参数,当时就有点疑惑,干嘛非要这样传呢?
继续点进去看,一直点到实际用到request:
public <T> RequestCallback httpEntityCallback(@Nullable Object requestBody, Type responseType) {return new RestTemplate.HttpEntityRequestCallback(requestBody, responseType);}
public HttpEntityRequestCallback(@Nullable Object requestBody, @Nullable Type responseType) {super(responseType);if (requestBody instanceof HttpEntity) {this.requestEntity = (HttpEntity)requestBody;} else if (requestBody != null) {this.requestEntity = new HttpEntity(requestBody);} else {this.requestEntity = HttpEntity.EMPTY;}}
发现最后RestTemplate.HttpEntityRequestCallback这个内部类当中的requestEntity都是要转换的,在最开始就转换可能也是为了避免出问题吧。
看一下HttpEntity的几种构造方式:
protected HttpEntity() {this((Object)null, (MultiValueMap)null);}public HttpEntity(T body) {this(body, (MultiValueMap)null);}public HttpEntity(MultiValueMap<String, String> headers) {this((Object)null, headers);}public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {this.body = body;HttpHeaders tempHeaders = new HttpHeaders();if (headers != null) {tempHeaders.putAll(headers);}this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);}
我们看到,headers是必须要传递mutivalueMap<String,String>类型的完整头参数的,不然就会生成空的headers。
然后就有了我第一版本的代码:
HttpHeaders headers = new HttpHeaders();headers.add("Content-Type","application/x-www-form-urlencoded;charset=utf-8");HttpEntity<ParamsPojo> httpEntity = new HttpEntity<>(paramsPojo, headers);URI uri = UriComponentsBuilder.fromUriString(url).build().toUri();ResponseEntity<String> stringResponseEntity;try {stringResponseEntity = restTemplate.postForEntity(uri, httpEntity, String.class);}catch (Exception e){log.error("http 请求接口失败");return null;}
我用的是一个普通的pojo类传递请求post请求中的参数,类似下面
public class ParamsPojo {String pa1;String pa2;String pa3;String pa4;
}
然后测试的时候报错,说不支持这个类型的请求体,之后也试过jsonObject和hashmap类型的参数,都不行,只有改成
HttpEntity<MultiValueMap<String,String>> httpEntity = new HttpEntity<>(params, headers);
就是请求体和头都用multiValueMap的类型才成功了。猜测可能是请求头类型用了x-www-form-urlencoded而不是json或者form
最后提示一下小问题,使用http请求数据的时候,数据中有中文的话可能会有乱码的情况出现,即使设置了对象头也会有,网上找的方案:
List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();httpMessageConverters.forEach(httpMessageConverter -> {if(httpMessageConverter instanceof StringHttpMessageConverter){StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;messageConverter.setDefaultCharset(StandardCharsets.UTF_8);}});
设置一下restemplate即可
postTemplate 发送的httpEntity格式和响应数据出现中文乱码问题相关推荐
- Jmeter运行后,查看结果树中的响应数据出现中文乱码。
参考:https://blog.csdn.net/qq_15228737/article/details/82597482 https://baike.baidu.com/item/UTF-8/481 ...
- jtl 转换html 乱码,解决 jmeter 非 GUI 模式运行测试,结果 jtl 文件没有响应数据及中文乱码...
jmeter 为了减轻客户机负担,没有默认把这些信息保存,如果想要保存,也可以,需要做出如下配置: 修改 bin 目录下的 user.properties 文件,追加配置: jmeter.save.s ...
- jmeter-察看结果树-响应数据,中文显示乱码问题处理
在使用Jmeter测试,察看结果树返回值的时候,响应数据,中文显示乱码.. 根据默认编码为:ISO-8859-1 # The encoding to be used if none is provid ...
- Jmeter察看结果树响应数据的中文显示为乱码的解决办法
问题描述:Jmeter运行结束,察看结果树响应数据的中文显示为乱码 解决办法: 1.找到Jmeter安装目录 bin\jmeter.properties文件,打开文件. 2.查找sampleresul ...
- php mysql存中文,PHP+MySQL存储数据常见中文乱码问题小结
PHP+MySQL存储数据常见中文乱码问题小结 本文实例总结了PHP+MySQL存储数据常见中文乱码问题.分享给大家供大家参考,具体如下: PHP+MySQL出现中文乱码的常见原因: 1. MYSQL ...
- 服务器响应到客户端中文乱码的解决方式
服务器与客户端交互的过程中出现中文乱码的解决方式 服务器响应到客户端中文乱码的解决方式 在Java Web开发的过程中,很多人都会遇到当服务器向浏览器发送响应页面时,有时候因为码表的查询不一致,会在浏 ...
- Django 分页查询并返回jsons数据,中文乱码解决方法
Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...
- java json utf-8_java读取json数据发生中文乱码的解决方法
java读取json数据发生中文乱码的解决方法 发布时间:2020-06-21 15:58:48 来源:亿速云 阅读:268 作者:鸽子 java读取json数据出现乱码的代码://从json文件中读 ...
- HttpServletResponse类的介绍和使用+解决响应传递给客户端数据的中文乱码问题
此文转载自:https://blog.csdn.net/qq_45821251/article/details/110249680 HttpServletResponse类作用 HttpServlet ...
最新文章
- 如何为 Python 添加远程调试能力而不修改系统代码
- php 循环curl,php中使用foreach curl多个URL及多线程请求多个URL
- 基于摄像头使用Cascade Classifier做人脸检测的方法及例程
- boost::format模块测试格式与枚举一起使用
- 一个链表创建、反转、打印的C语言代码
- 【深入浅出WF】——令牌环的变身—书签
- 系统背景描述_【计算机论文】管件加工管理系统和数据库的结构探析
- php debug用什么意思,phpdebug_backtrace()函数是干什么的?
- POJ 1804 Brainman (归并排序 -- 求逆序对数)
- vscode右键没有open in browser
- Java-旋转字符串
- java 视频上传_java实现大视频上传
- 几何分布的期望和方差公式推导_学习笔记:几种特殊分布之间的关系
- tar命令中--exclude参数详解
- 找不到服务器或dsn错误,win7浏览网页提示“找不到服务器或DNS错误”原因及解决方法...
- 2022华南师范大学软院软件工程考研经验贴(初试380)
- c++可视化 横向打印二叉树(连线、规整)
- More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'
- “后网联时代”聚合支付发展方向思考
- 一个统计Word文档中行数的VBA例程
热门文章
- 区块链100讲:SSL协议之数据加密过程详解
- 【GDKOI】2021普及Day2
- Spite 和Image的区别
- CtsTelephonyTestCases
- 华为支付购买Token的verify接口报错wrong application
- 微信支付原总经理吴毅:离开腾讯,如何再战蚂蚁金服?
- 基于JAVA+SpringMVC+MYSQL的智能社区管理系统
- 活动报名丨英伟达AI Lab科学家、GET3D一作高俊:从图像中学习3D对象的生成建模...
- 中韩印尼6大子论坛齐聚 | PGConf.Asia亚洲技术大会DAY3迎来收官
- json语法和json解析