1. 背景
项目上需要写一个大屏批量、定时调用接口的websocket,为了方便,决定使用spring自带的RestTemplate来完成http请求。get请求时,没那么多需要注意的地方。但在post请求时出现了问题。
2. 遇到的问题
先来看一下post请求的代码实例
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
List<Object> idList = new ArrayList<>();
idList.add("62d7d2d639b7566338080876");
idList.add("6290584aad22ce2849baba5a");
body.add("idList", idList);//问题出现在这个地方
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(body, headers);
String reqUrl= "http://192.168.18.228:9999/ts-query/api/user/define/service/list";
DataSet<?> platformResult = new RestTemplate().postForEntity(reqUrl, entity, DataSet.class).getBody();
跟踪代码发现
查了一下MultiValueMap的说明发现了此问题出现的原因:
MultiValueMap同一个key下面可以放多个value
意思就是如果用add方法存放,会放到一个数组中,不会像普通map一样进行重复键覆盖的情况
所以就出现了上面截图出现的一个key中存放的居然是个数组中的数组,导致调用请求未正常返回
源码如下
@Override
public void add(K key, @Nullable V value) {
List<V> values = this.targetMap.computeIfAbsent(key, k -> new LinkedList<>());
values.add(value);
}
3. 解决方案
很简单,将有问题的代码修改为以下代码即可
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
List<Object> idList = new ArrayList<>();
idList.add("62d7d2d639b7566338080876");
idList.add("6290584aad22ce2849baba5a");
body.put("idList", idList);// 将add修改为put即可
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(body, headers);
String reqUrl= "http://192.168.18.228:9999/ts-query/api/user/define/service/list";
DataSet<?> platformResult = new RestTemplate().postForEntity(reqUrl, entity, DataSet.class).getBody();
文章来源:https://www.toymoban.com/news/detail-655160.html
当然,请求参数用add还是用put,需要根据业务需求来使用。put方法只允许存放List<Object>类型的参数,所以有一定的局限性。也可以将上面的代码修改为如下方式文章来源地址https://www.toymoban.com/news/detail-655160.html
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
// List<Object> idList = new ArrayList<>();
// idList.add("62d7d2d639b7566338080876");
// idList.add("6290584aad22ce2849baba5a");
body.add("idList", "62d7d2d639b7566338080876");
body.add("idList", "6290584aad22ce2849baba5a");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(body, headers);
String reqUrl= "http://192.168.18.228:9999/ts-query/api/user/define/service/list";
DataSet<?> platformResult = new RestTemplate().postForEntity(reqUrl, entity, DataSet.class).getBody();
到了这里,关于RestTemplate进行post请求调用需要注意的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!