RestTemplate发送HTTP请求

news2024/9/27 13:22:30

一、前言

之前对发送http请求,使用过okhttp,还有httpclient等,这次就直接使用springboot的RestTemplate了。

二、不同的请求方式

我这里只针对POST请求做说明:
下面针对post请求做三种说明:

1、调用的接口参数用@RequestParam标识

此种在APIfox中传参方式是地址栏传参数,没有请求体。

    /**
     * 发送没有请求体的请求
     * @param url 请求url
     * @param reqParam 地址栏参数
     * @return 想要结果
     */
    public static JSONObject httpPostResult(String url, Map<String, Object> reqParam) {
        String params = getParameter(reqParam);
        if (StringUtils.isBlank(params)) {
            log.error("获取sign失败,sign=null");
            return null;
        }
        HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(setHeaders());
        //解析请求结果
        String result = new RestTemplate().postForObject(url + params, httpEntity, String.class);
        return JSONObject.parseObject(result);
    }
 
    /**
     * 对地址栏的参数进行拼接
     * @param map 地址栏参数
     * @return 拼接后的结果
     */
    public static String getParameter(Map<String, Object> map) {
        try {
            if (MapUtil.isEmpty(map)) {
                return null;
            }
            String result = "";
            for (String key : map.keySet()) {
                if (Objects.nonNull(map.get(key) )) {
                    if (!"".equals(result)) {
                        result += "&";
                    }
                    result = result + key + "=" + map.get(key);
                }
            }
            return result;
        } catch (Exception e) {
            log.error("map转参出错", e);
        }
        return null;
    }

    /**
     * 设置请求头
     * @return 请求头
     */
   private static HttpHeaders setHeaders() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Accept", MediaType.APPLICATION_JSON.toString());
        httpHeaders.add("Accept-Charset", "UTF-8");
        return httpHeaders;
    }

在Apifox中调用如下:
在这里插入图片描述
请求体body=none。

对应的curl命令如下:

curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc&param2=123&param3=def' \

2、调用的接口参数用@RequestBody标识

此种在APIfox中传参方式是地址栏需要传参数,且有请求体。

    /**
     * 发送带有地址栏参数,有请求体的请求
     * @param url 请求 url
     * @param reqParam url上的参数
     * @param reqBody 请求体
     * @return 响应结果
     */
    public static JSONObject httpPostResult(String url, Map<String, Object> reqParam, Map<String, Object> reqBody) {
        String params = getParameter(reqParam);
        if (StringUtils.isBlank(params)) {
            log.error("获取sign失败,sign=null");
            return null;
        }
        //封装请求头和内容
        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(reqBody, setHeaders());
        //解析请求结果
        String result = new RestTemplate().postForObject(url + params, requestEntity, String.class);
        return JSONObject.parseObject(result);
    }

Apifox上我就只展示body了:
在这里插入图片描述
Params和上面的没有请求体的一样。

curl命令如下:

curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc&param2=123&param3=def' --header 'Content-Type: application/json' \
--data-raw '{"parentId":80}'

这个命令里面的data-raw的值就是请求体。

3、调用的接口参数没有标识

这种的是所有的参数都使用form-data的格式进行传输:
在这里插入图片描述
这种就必须使用LinkedMultiValueMap对参数进行封装:

    /**
     * 发送form-data请求
     * @param url 请求 url
     * @param data 请求体
     * @return 响应结果
     */
    public JSONObject httpPostResult(String url, MultiValueMap<String, String> data) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //解析请求结果
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(data, headers);
        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
        return JSONObject.parseObject(response.getBody());
    }

对应的controller中不需要任何注解:

 @PostMapping("/postRequest")
    public JSONObject intervalData(ChargeLogIntervalDataReq request) {
        String url = "http://xxx:8081/api/list";
        MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
        data.put("page", Lists.newArrayList(request.getPage()));
        data.put("limit", Lists.newArrayList(request.getLimit()));
        return httpUtils.httpPostResult(url, data);
    }

这里要注意,MultiValueMap的value得是list才行。

--------------你知道的越多,不知道的越多-------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我们来谈谈https

"这一封信只是得到它要回答问题&#xff0c;那个答案早已点燃在心里" 一、 http明文传输 紧接上文这仍然是一款拙劣的http服务器&#xff0c;我们此时在用户数输入栏输入数据信息并提交表单。我们先来认识认识使用到的两个工具软件。 1.PostMan postman是一款支持h…

阿里巴巴首次公开4份【并发编程全彩小册】:模型 + 原理 + 应用 + 模式, 四管齐下

相信大家都是知道的&#xff0c;阿里可以说是程序员的“必修地”每一个程序员都渴望去阿里看看&#xff0c;学习进步一下&#xff0c;但是有时候偏偏局限于自己的技术不到位&#xff01; 但是没关系&#xff0c;就算进不来了阿里&#xff0c;但是可以学习他们的技术呀&#xf…

CONT: Contrastive Neural Text Generation

CONT: Contrastive Neural Text Generation 首先&#xff0c;CONT使用自己的预测中的负面例子&#xff08;3.1&#xff09;来构建B集。&#xff08;原因解释&#xff1a;Kalkstein等人[18]指出&#xff0c;使用不同的对比性样本有助于提高模型的泛化能力。因此&#xff0c;我们…

短视频云端批量混剪实操指南

本文为阿里云智能媒体服务IMS「智能内容创作」实践指南第一期&#xff0c;讲述围绕新媒体广告营销场景&#xff0c;通过“去重策略”全自动批量混剪短视频&#xff0c;助力更高效、更快速地创作优质短视频内容。 欧叔&#xff5c;作者 5G时代&#xff0c;越来越多的企业把短视…

步进电机 力矩选型参考

(* 要提升1KG 的物体&#xff0c;以0 .3 米/秒的速度的提升&#xff0c;步进电机如何选型&#xff1f; 如果不是克服重力则FM*A 力越大加速度越大 *) Clear["Global"] qua 0.2;(* 输入 quality 1kg *) Tao qua*9.8; mps 0.2;(* 输入 0.3 M/S *) dia 0.01;(* 1cm…

多对一(association)、一对多(collection)

1、多对一的处理 多对一的理解&#xff1a; 多个学生对应一个老师如果对于学生这边&#xff0c;就是多对一的现象&#xff0c;即从学生这边关联一个老师&#xff01; 1.1、数据库的设计 CREATE TABLE teacher ( id INT(10) NOT NULL, name VARCHAR(30) DEFAULT NULL, PRIMAR…

Apple Vision Pro -开始使用visionOS

Apple Vision Pro -开始使用visionOS visionOS将熟悉的框架和全新的概念结合在一起&#xff0c;因此您可以为空间计算构建一个全新的应用程序世界。为了帮助您开始您的旅程&#xff0c;我们将介绍一系列会议&#xff0c;涵盖空间计算的构建块以及为该平台设计应用程序和游戏。…

软件开发模型

一、 概述   软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码、测试和维护 阶段。   软件开发模型能清晰、直观地表达软件开发全过程&#xff0c;明确规定了要完成的主要活动和任务&#xff0c;用来作…

rider发布项目报错:[MSB4057] 该项目中不存在目标“WebPublish”。

情景再现 Rider升级到2022.3版本及以上时&#xff0c;发布项目显示&#xff1a; [MSB4057] 该项目中不存在目标“WebPublish”。 或者显示 Error:Current toolset does not support publishing for non-Core ASP.NET projects 原因 这是因为Rider MSBuild版本不一致导致。 解…

基于javaweb(springboot+mybatis)宠物医院预约管理系统设计和实现以及论文报告

基于javaweb(springbootmybatis)宠物医院预约管理系统设计和实现以及论文报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

参会记录 | 北京智源大会-基础模型前沿技术论坛

2023年6月10日上午&#xff0c;线上参与了北京智源大会&#xff0c;主要观看了2023北京智源大会-基础模型前沿技术论坛&#xff0c;以下是论坛中比较感兴趣的点和思考。 本次论坛的演讲嘉宾如下&#xff1a; 上述嘉宾有来自业界的刘胤晗老师和周彦祺老师&#xff0c;也有来自…

【06】STM32·HAL库开发-STM系统框架 | STM32寻址范围 | STM32存储器映射 | STM32寄存器映射

目录 1.STM32系统框架&#xff08;了解&#xff09;1.1Cortex M内核 & 芯片1.2F1系统架构1.2.1F1系统框架简图1.2.2F1系统框架总图 1.3F4系统架构1.3.1F4系统框架简图&#xff08;F407为例&#xff09;1.3.2F4系统框架总图 1.4F7系统架构1.4.1多重AHB总线矩阵1.4.2F7系统结…

如何防止U盘复制电脑文件?

在我们的工作中&#xff0c;经常需要将重要的文件存在电脑中&#xff0c;我们必须要妥善的保护这些重要数据&#xff0c;那么该如何防止U盘复制电脑中的文件呢&#xff1f; 要想防止U盘复制电脑文件&#xff0c;可从三个方面入手&#xff0c;分别是&#xff1a; 禁止电脑使用U…

吴恩达471机器学习入门课程1第2周——线性回归(单变量)

文章目录 Linear Regression1 导包2 - 问题陈述3 - 数据集可视化数据 4 - 线性回归复习5 - 计算代价代价函数模型预测实现 6 - 梯度下降批量梯度下降法学习参数 Linear Regression 您将使用一个变量实现线性回归&#xff0c;以预测餐厅特许经营的利润。 1 导包 首先&#xf…

【电路】电路与电子技术基础 课堂笔记 第12章 集成逻辑门电路

12.4 正逻辑与负逻辑 正负逻辑转换规则 正负逻辑符号

2023 华为 Datacom-HCIE 真题题库 (6月11新增部分)--含解析

单项选择题 1.[试题编号:263143] (单选题)华为CloudCampus位置服务(wifi方案),获取基于在wifi的位置数据,并上报至开发者的LBS应用。开发者可以使用数据,计算范围内的wi-fi终端位置信息。对于LBS位置应用和iMaster NCE的交互流程,以下哪项是错误的?(单选)单选 A、LBS…

Vue中如何进行Markdown编辑与渲染?

Vue中如何进行Markdown编辑与渲染&#xff1f; Markdown是一种轻量级的标记语言&#xff0c;广泛用于编写技术文档、博客、论坛等。Vue.js是一款流行的JavaScript框架&#xff0c;它提供了一些有用的工具来处理DOM元素和用户界面。在Vue中&#xff0c;我们可以使用一些库和组件…

除了Midjourney和Stable Diffusion,还有哪些AI模型可以使用

Midjourney是一款广受设计师和艺术家欢迎的人工智能图像生成器。然而&#xff0c;最近它停止提供免费试用&#xff0c;让许多用户开始寻找替代品。在本文中&#xff0c;我们为您编制了一个2023年可尝试的十大Midjourney替代品列表。我们包括了免费和付费选项&#xff0c;让您可…

Hutool工具类库之图片验证码

文章目录 一、介绍二、示例1、LineCaptcha 线段干扰的验证码2、CircleCaptcha 圆圈干扰验证码3、ShearCaptcha 扭曲干扰验证码4、GifCaptcha 验证码5、写出到浏览器&#xff08;Servlet输出&#xff09;6、自定义验证码 一、介绍 验证码功能位于 cn.hutool.captcha 包中&#x…

【电路】电路与电子技术基础 课堂笔记 第13章 组合逻辑电路的分析与设计

组合逻辑电路&#xff1a;任意时刻的输出稳定状态仅仅取决于该时刻的输入信号&#xff0c;而与输入信号作用前电路所处的状态无关。 13.1 组合逻辑电路分析 13.1.2 加法器电路分析 S就是Sum&#xff0c;CO 就是Carry-Over&#xff08;进位&#xff09;。 算术运算是数字系统的…