项目中有个地方需要请求第三方接口的数据,接口规定了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格式和响应数据出现中文乱码问题相关推荐

  1. Jmeter运行后,查看结果树中的响应数据出现中文乱码。

    参考:https://blog.csdn.net/qq_15228737/article/details/82597482 https://baike.baidu.com/item/UTF-8/481 ...

  2. jtl 转换html 乱码,解决 jmeter 非 GUI 模式运行测试,结果 jtl 文件没有响应数据及中文乱码...

    jmeter 为了减轻客户机负担,没有默认把这些信息保存,如果想要保存,也可以,需要做出如下配置: 修改 bin 目录下的 user.properties 文件,追加配置: jmeter.save.s ...

  3. jmeter-察看结果树-响应数据,中文显示乱码问题处理

    在使用Jmeter测试,察看结果树返回值的时候,响应数据,中文显示乱码.. 根据默认编码为:ISO-8859-1 # The encoding to be used if none is provid ...

  4. Jmeter察看结果树响应数据的中文显示为乱码的解决办法

    问题描述:Jmeter运行结束,察看结果树响应数据的中文显示为乱码 解决办法: 1.找到Jmeter安装目录 bin\jmeter.properties文件,打开文件. 2.查找sampleresul ...

  5. php mysql存中文,PHP+MySQL存储数据常见中文乱码问题小结

    PHP+MySQL存储数据常见中文乱码问题小结 本文实例总结了PHP+MySQL存储数据常见中文乱码问题.分享给大家供大家参考,具体如下: PHP+MySQL出现中文乱码的常见原因: 1. MYSQL ...

  6. 服务器响应到客户端中文乱码的解决方式

    服务器与客户端交互的过程中出现中文乱码的解决方式 服务器响应到客户端中文乱码的解决方式 在Java Web开发的过程中,很多人都会遇到当服务器向浏览器发送响应页面时,有时候因为码表的查询不一致,会在浏 ...

  7. Django 分页查询并返回jsons数据,中文乱码解决方法

    Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...

  8. java json utf-8_java读取json数据发生中文乱码的解决方法

    java读取json数据发生中文乱码的解决方法 发布时间:2020-06-21 15:58:48 来源:亿速云 阅读:268 作者:鸽子 java读取json数据出现乱码的代码://从json文件中读 ...

  9. HttpServletResponse类的介绍和使用+解决响应传递给客户端数据的中文乱码问题

    此文转载自:https://blog.csdn.net/qq_45821251/article/details/110249680 HttpServletResponse类作用 HttpServlet ...

最新文章

  1. 如何为 Python 添加远程调试能力而不修改系统代码
  2. php 循环curl,php中使用foreach curl多个URL及多线程请求多个URL
  3. 基于摄像头使用Cascade Classifier做人脸检测的方法及例程
  4. boost::format模块测试格式与枚举一起使用
  5. 一个链表创建、反转、打印的C语言代码
  6. 【深入浅出WF】——令牌环的变身—书签
  7. 系统背景描述_【计算机论文】管件加工管理系统和数据库的结构探析
  8. php debug用什么意思,phpdebug_backtrace()函数是干什么的?
  9. POJ 1804 Brainman (归并排序 -- 求逆序对数)
  10. vscode右键没有open in browser
  11. Java-旋转字符串
  12. java 视频上传_java实现大视频上传
  13. 几何分布的期望和方差公式推导_学习笔记:几种特殊分布之间的关系
  14. tar命令中--exclude参数详解
  15. 找不到服务器或dsn错误,win7浏览网页提示“找不到服务器或DNS错误”原因及解决方法...
  16. 2022华南师范大学软院软件工程考研经验贴(初试380)
  17. c++可视化 横向打印二叉树(连线、规整)
  18. More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'
  19. “后网联时代”聚合支付发展方向思考
  20. 一个统计Word文档中行数的VBA例程

热门文章

  1. 区块链100讲:SSL协议之数据加密过程详解
  2. 【GDKOI】2021普及Day2
  3. Spite 和Image的区别
  4. CtsTelephonyTestCases
  5. 华为支付购买Token的verify接口报错wrong application
  6. 微信支付原总经理吴毅:离开腾讯,如何再战蚂蚁金服?
  7. 基于JAVA+SpringMVC+MYSQL的智能社区管理系统
  8. 活动报名丨英伟达AI Lab科学家、GET3D一作高俊:从图像中学习3D对象的生成建模...
  9. 中韩印尼6大子论坛齐聚 | PGConf.Asia亚洲技术大会DAY3迎来收官
  10. json语法和json解析