RestTemplate进行post请求调用需要注意的坑

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();

 当然,请求参数用add还是用put,需要根据业务需求来使用。put方法只允许存放List<Object>类型的参数,所以有一定的局限性。也可以将上面的代码修改为如下方式

        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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate是Spring Framework提供的一个用于进行HTTP请求的类库。要使用RestTemplate发起POST请求,你可以按照以下步骤进行操作: 1. 首先,你需要创建一个RestTemplate对象,可以通过在Spring容器中进行注入或者直接实例化来获取一个RestTemplate实例。 2. 创建一个表示请求体的对象,可以是一个POJO对象或者是一个Map对象,根据具体的需求来决定。 3. 如果有需要,你可以设置请求头信息,例如设置Content-Type、Authorization等。 4. 调用RestTemplate对象的postForObject()方法来发送POST请求,并且接收响应结果。 下面是一个使用RestTemplate发起POST请求的示例代码: ```java import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; public class PostExample { public static void main(String[] args) { // 创建RestTemplate对象 RestTemplate restTemplate = new RestTemplate(); // 创建请求体对象 YourRequestObject requestObject = new YourRequestObject(); // 设置请求头信息 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 创建HttpEntity对象,用于封装请求体和请求头 HttpEntity<YourRequestObject> httpEntity = new HttpEntity<>(requestObject, headers); // 发送POST请求,并接收响应结果 ResponseEntity<YourResponseObject> responseEntity = restTemplate.exchange( "http://example.com/api/endpoint", // 请求URL HttpMethod.POST, // 请求方法 httpEntity, // 请求体和请求头 YourResponseObject.class // 响应结果类型 ); // 获取响应结果 YourResponseObject responseObject = responseEntity.getBody(); // 处理响应结果 } } ``` 以上代码中的`YourRequestObject`和`YourResponseObject`分别表示请求体和响应结果的自定义对象,你需要根据实际情况进行替换。另外,根据你的需求可能需要进行异常处理、日志记录等其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值