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

这篇具有很好参考价值的文章主要介绍了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();

跟踪代码发现

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

 查了一下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();

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

 当然,请求参数用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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试

    我们的服务需要调用别人的接口,由于对方的接口服务不是很稳定,经常超时,于是需要增加一套重试逻辑。这里使用 Spring Retry 的方式来实现。 一、引入POM 二、 修改启动类 在Spring Boot 应用入口启动类,也就是配置类的上面加上 @EnableRetry 注解,表示让重试机制生效。 注意

    2024年02月08日
    浏览(44)
  • restTemplate发送https请求报错I/O error on POST request for “xxxx“: Remote host terminated the handshake解决

    最近在项目开发中遇到了一个问题,用restTemplate调用https接口的时候一直掉不通,报错I/O error on POST request for “xxxx”: Remote host terminated the handshake;nested exception is javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake 远程主机终止了握手 一开始以为是SSL证书的问题。在百度

    2024年02月11日
    浏览(54)
  • 万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求

    业务场景 :在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流; 下面这个例子就包含日常开发中大

    2024年02月05日
    浏览(66)
  • java调用http接口(get请求和post请求)

    1.http接口的格式如下: 图片选择失败,我只能把数据贴出来,如果有不懂的可以问我哈。 http://localhost:8881/department/getDepartmentList接口数据如下:(请求方式是GET) http://localhost:8881/department/getDataById?id=3接口数据如下:(请求方式是POST) 2.需要引入的包有: 3.实现方法如下:

    2024年02月13日
    浏览(56)
  • java中使用hutool调用get请求,post请求

    一、hutool工具包实现 1、get请求 2、post请求 二、java net实现 1、java中http协议调用get请求 2、java中https协议调用get请求

    2024年02月11日
    浏览(41)
  • SpringCloud入门(微服务调用 OpenFeign)——从RestTemplate到OpenFeign & OpenFeign的相关配置 & 源码的分析和请求流程拆解

    在之前的博客中,我们介绍了RestTemplate的使用,博客文章如下连接。但是在使用RestTemplate的时候,需要把生产者的路径拼出来,非常繁琐,另外参数的传递的也比较繁琐,解决方案就是使用openFeign。 SpringCloud入门(RestTemplate + Ribbon)——微服务调用的方式 RestTemplate的使用 使

    2024年04月11日
    浏览(38)
  • 原生js XMLHttpRequest发送 get post 请求 解决跨域 及 注意事项

    2、使用xhr发起GET请求 四个步骤: ①:创建 xhr对象 ②:调用 xhr的open()函数(open中传递两个参数,参数一是GET/POST请求方式,参数二是请求的URL地址) ③:调用 xhr.send()函数 ④:监听 xhr.onreadystatechange事件 xhr发起GET请求的完整代码 直接上示例 报错内容是这个 Failed to execute

    2024年02月16日
    浏览(57)
  • HTTP POST接口带参数的HttpClient请求方法和调用

    接口自动化测试,今天遇到POST接口带参数,参数在url上,发现原来的工具类中没有该方法,重新调试加上。  doPost方法如下: 参考: [Java 接口自动化框架]httpclient4.5.3(CloseableHttpClient) https的工具类HttpsClientUtils

    2024年02月06日
    浏览(48)
  • 【js】原生js进行post请求

    【js】原生js进行post请求 let url = \\\'https://xxxupload\\\'       let params = {         \\\"body\\\": {           \\\"id\\\": row.id         },         \\\"channel\\\": \\\"\\\",         \\\"token\\\": \\\"\\\",         \\\"userId\\\": \\\"\\\",         \\\"version\\\": \\\"1.1.0\\\"       }                        let xhr = new XMLHttpRequest(); // 创建XHR对象  

    2024年02月12日
    浏览(36)
  • 再谈http请求调用(Post与Get),项目研发的核心一环

    支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) 【目录】 前言 Post请求 Get请求 与其它工具的比较   1【前言】 http请求调用是开发中经常会用到的功能。 在内,调用自有项目的Web Api等形式接口时会用到;在外,调用一些第三方功能接口时,也会用到,因为,这些第三方功能往

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包