MultiValueMap在restTemplate的一次错误使用

发布时间 2023-06-03 02:53:43作者: White_白

问题:post请求一个三方接口时,restTemplate请求,三方接口一直报错“网络错误”。

以为请求头Content-Type参数不对(三方要求”application/json;charset=UTF-8“,但是org.springframework.http.MediaType.APPLICATION_JSON_UTF8,在spring5.2已经废弃了,理由是现在主流的浏览器已经符合规范并正确解释UTF-8特殊字符),尝试几种还是一样报错。换了一个http请求发送框架,hultool的HttpUtil.post(),又是正常的。为了探明原因,只好用打出http的所有信息来分析了。

发现:restTemplate请求体的json数据value值,都是集合格式。

{
  "name": ["tom"],
  "age": ["18"]  
}

hultool的HttpUtil.post()请求体数据为正常的json格式

{
  "name": "tom",
  "age": "18" 
}

这里才是请求出错的根本原因。

解决:restTemplate的HttpEntity对象构建不能用MultiValueMap,改用普通的HashMap。

HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(publicParam, headers);
String response = restTemplate.postForObject(url, httpEntity, String.class);

总结:MultiValueMap的value都是list类型,用在此处不对。

有文章说restTemplate提交表单时必须用MultiValueMap,出处:https://blog.csdn.net/qq_33589510/article/details/121527830

另附一篇MultiValueMap正确使用的文章,https://www.cnblogs.com/PocketHeart/p/15314345.html