SpringBoot使用RestTemplate发送http请求(实操版)

news2025/1/16 6:53:29

前言

查看此文章前强烈建议先看这篇文章:Java江湖路 | 专栏目录


该文章纪录的是SpringBoot使用RestTemplate发送http请求,每一步都有记录,争取每一位看该文章的小伙伴都能操作成功。达到自己想要的效果~

文章目录

  • 前言
  • 1、SpringBoot调用外部接口的三种方式
  • 2、什么是RestTemplate
  • 3、SpringBoot中使用RestTmplate
    • 3.1、前置准备
    • 3.2、Get请求方式
    • 3.3、Post请求
    • 3.4、解决中文乱码
    • 3.5、封装工具类
  • 总结


1、SpringBoot调用外部接口的三种方式

  1. 原始httpClient
  2. RestTemplate
  3. Feign

本文着重介绍RestTemplate方式

2、什么是RestTemplate

RestTemplateSpring 框架提供的 ,可用于在应用中调用 rest 服务,它简化了与 http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接, 我们只需要传入url及返回值类型即可。相较于之前常用的 HttpClient,RestTemplate 是一种更优雅的调用 RESTful 服务的方式


3、SpringBoot中使用RestTmplate

3.1、前置准备

1、创建一个普通的SpringBoot项目

2、创建一个配置类,

package com.eric.springbootresttemplate.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author Eric
 * @date 2023-08-03 9:37
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

3、准备一个实体类

package com.eric.springbootresttemplate.entity;

import lombok.Builder;
import lombok.Data;

/**
 * @author Eric
 * @date 2023-08-03 9:33
 */
@Data
@Builder
public class User {
    private Long id;
    private String name;
}

4、创建两个被请求的接口(模拟其他服务接口)

    @GetMapping("/getUserInfo")
    public User getUserList(Long id, String name) {
        User user = User.builder().id(id).name(name).build();
        return user;
    }

    @PostMapping("/postUserInfo")
    public User postUserInfo(@RequestBody JSONObject jsonObject) {
        Long id = jsonObject.getLong("id");
        String name = jsonObject.getString("name");
        User user = User.builder().id(id).name(name).build();
        return user;
    }

3.2、Get请求方式

get有两种请求方式,一种正常的在url拼接参数,一种是使用占位符的方式

方式一:参数拼接

    @Resource
    private RestTemplate restTemplate;
 
     /**
     * Get请求方式一:参数拼接
     * @param id
     * @param name
     */
    @GetMapping("/getUserInfoRest")
    public void getUserInfoRest(Long id, String name) {
        String url = "http://localhost:8080/rest/getUserInfo?id=" + id + "&name=" + name;
        ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
        System.out.println(result.getStatusCode());
        System.out.println(result.getBody());
        System.out.println(result.getHeaders());
    }

方式二:占位符方式
直接在方法中指定参数:

    @Resource
    private RestTemplate restTemplate;
    
     /**
     * Get请求方式二:占位符方式
     * @param id
     * @param name
     */
    @GetMapping("/getUserInfoRest2")
    public void getUserInfoRest2(Long id, String name) {
        String url = "http://localhost:8080/rest/getUserInfo?id={id}&name={name}";
        ResponseEntity<String> result = restTemplate.getForEntity(url, String.class,id,name);
        System.out.println(result.getStatusCode());
        System.out.println(result.getBody());
        System.out.println(result.getHeaders());
    }

两种方式的执行结果如下:
在这里插入图片描述


3.3、Post请求


    /**
     * Post请求方式:带@RequestBody
     */
    @PostMapping("/postUserInfoRest")
    public void postUserInfoRest() {
        Map<String, Object> requestBody = new HashMap<>();

        requestBody.put("id", 1L);
        requestBody.put("name", "Eric");
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, Object>> r = new HttpEntity<Map<String, Object>>(requestBody, requestHeaders);

        String url = "http://localhost:8080/rest/postUserInfo";
        String result = restTemplate.postForObject(url, r, String.class);

        System.out.println(result);
    }


结果如下:

在这里插入图片描述

3.4、解决中文乱码


上述请求可能会存在中文乱码,只需要额外设置下即可

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));

3.5、封装工具类

在日常中,我们可以直接将get和post简单的封装为一个工具类, 方便我们直接调用(这里我只是简单的封装了下,大家如果可以根据自己的使用场景再次封装~)

package com.wzhy.smart.common.common.utils;

package com.eric.springbootresttemplate.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * RestTemplate请求工具类
 *
 * @author Eric
 * @date 2023-08-03 10:36
 */
@Slf4j
public class RestTemplateUtil {

    /**
     * post请求
     *
     * @param url       请求路径
     * @param parameter 请求参数
     * @return 返回值
     */
    public static String post(String url, Map<String, Object> parameter) {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, Object>> r = new HttpEntity<Map<String, Object>>(parameter, requestHeaders);
        String body = restTemplate.postForObject(url, r, String.class);
//        log.info("远程调用结果,body为:{}", body);
        return body;
    }

    /**
     * get请求
     *
     * @param url       请求路径
     * @param parameter 请求参数
     * @return 返回值
     */
    public static String get(String url, Map<String, Object> parameter) {
        if (!parameter.isEmpty()) {
            url = url + "?";
            for (String key : parameter.keySet()) {
                url = url + key + "=" + parameter.get(key) + "&";
            }
            url = url.substring(0, url.length() - 1);
        }
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        String body = restTemplate.getForEntity(url, String.class, parameter).getBody();
//        log.info("远程调用结果,body为:{}", body);
        return body;
    }

}



总结

怎么样,是不是特别的方便和简单~

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

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

相关文章

RabbitMQ(二)

二、高级特性、应用问题以及集群搭建 高级特性 1.消息的可靠性投递 在使用RabbitMQ的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 rabbitMQ整个消息投递的路径为&#xff1a; produ…

mysql-入门笔记-3

# ----------排序查询-------- # 语法 # select 字段列表 from 表名 order by 字段1 排序方式1 ,字段2 排序方式2 ; DESC 降序 ASC升序 # 1 根据年龄对公司的员工进行升序排序---默认升序-黄色提示代码冗余 select * from userTable order by age ASC ; # 2 根据入职时间,对员…

LPython:最新的高性能Python实现、速度极快且支持多后端

LPython 是最新的开源 Python 实现&#xff0c;目标是打造高性能版本的 Python。 LPython 官网写道&#xff0c;它一直作为 Python 编译器在开发&#xff0c;能够生成优化的机器代码。LPython 的后端支持 LLVM、C/C 翻译&#xff0c;甚至还支持 WebAssembly (WASM)。 LPython 主…

CGAL-几何对象基础判断-点线段使用-hello world

文章目录 1.概述2.点和线段3.点序列的凸包3.1.内置数组中点的凸包3.2.向量中点的凸包 4.关于kernel和Traits类5.概念和模型 1.概述 本教程是为CGAL新手&#xff0c;大概知道c和几何算法的基本知识。第一部分展示了如何定义点和段类&#xff0c;以及如何在它们上应用几何谓词。…

环球数科、BUFFALO面试(部分)

环球数科 系统复杂且需求迭代频繁&#xff0c;如何维护微服务之间的接口调用关系&#xff1f; API接口在设计的时候需要大量的需求文档&#xff0c;而且文档也需要不断维护。如何高效维护API文档就很重要了。以下是一些常见的API管理工具&#xff1a;Swagger&#xff1a;Swag…

云主机OOM宕机原因分级及处理

一、故障现象 某次服务器告警宕机故障&#xff0c;无法ssh连入&#xff0c;控制台登录后查看&#xff0c;发生OOM事件&#xff0c;OOM就是我们常说的Out of Memory内存溢出&#xff0c;它是指需要的内存空间大于系统分配的内存空间&#xff0c;导致项目程序crash&#xff0c;甚…

【MySQL】使用C/C++连接MySQL数据库

【MySQL】使用C/C连接MySQL数据库 验证使用select特殊点 本文目的&#xff1a;使用MySQL提供的CAPI完成对数据库的操作 验证 #include <iostream> #include <mysql/mysql.h>int main() {std::cout<<"mysql cilent version: "<<mysql_get_cl…

面试热题100(二叉树的右视图)

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 树这类问题用的最多的就是递归&#xff0c;因为树具有天然的递归结构&#xff1a; 我们来分析一下题目&#xff0c;给定一棵树根结…

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…

nvm安装和使用

公司不同系统用的node版本不一样&#xff0c;所以就需要安装多版本了&#xff0c;那么使用nvm来管理就大大方便了开发。 使用nvm有哪些好处呢 安装node很方便&#xff0c;只需要一条命令可以轻松切换node版本可以多版本node并存 需要注意的是安装之前先把原有的node给卸载掉…

24考研数据结构-线索二叉树的线索化

目录 数据结构&#xff1a;线索二叉树与线索化线索二叉树的定义线索化过程线索化的应用总结 5.3.2线索二叉树1. 线索二叉树的概念与作用2.线索二叉树的存储结构3. 二叉树的线索化1. 中序线索化2. 先序线索化3. 后序线索化 4. 线索树的寻找前驱后继的各种情况&#xff08;多理解…

向“数”而“深”,联想凌拓的“破局求变”底气何来?

前言&#xff1a;要赢得更多机遇&#xff0c;“破局求变”尤为重要。 【全球存储观察 &#xff5c; 热点关注】2019年2月25日&#xff0c;承袭联想集团与NetApp的“双基因”&#xff0c;联想凌拓正式成立。历经四年多的发展&#xff0c;联想凌拓已成为中国企业级数据管理领域的…

opencv-29 Otsu 处理(图像分割)

Otsu 处理 Otsu 处理是一种用于图像分割的方法&#xff0c;旨在自动找到一个阈值&#xff0c;将图像分成两个类别&#xff1a;前景和背景。这种方法最初由日本学者大津展之&#xff08;Nobuyuki Otsu&#xff09;在 1979 年提出 在 Otsu 处理中&#xff0c;我们通过最小化类别内…

C语言-------函数栈帧的创建和销毁------剖析描骨

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

Talk | 新加坡国立大学博士生施宇钧:DragDiffusion-基于扩散模型的关键点拖拽图片编辑

本期为TechBeat人工智能社区第518期线上Talk&#xff01; 北京时间8月2日(周三)20:00&#xff0c; 新加坡国立大学博士生—施宇钧的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “DragDiffusion-基于扩散模型的关键点拖拽图片编辑”&#xff0c;他…

浅谈机器视觉

目录 1.什么是机器视觉 2.学习机器视觉需要掌握的知识 3.机器视觉的由来 4.机器视觉带来的福利 1.什么是机器视觉 机器视觉&#xff08;Computer Vision&#xff09;是人工智能领域中的一个分支&#xff0c;旨在通过模仿人类的视觉系统&#xff0c;使计算机能够理解和解释图…

使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查

官方云数据库文档 前置步骤使用uni-app新建一个uniCloud项目 [外链图片转存失败,源站可能有防盗官方云数据库文档]!链机制,建议将()https://uniapp.dcloud.net.cn/uniCloud/hellodb.html)] 新建表 这里我加了几个测试字段 createTime、remark、money // 文档教程: https://un…

深度强化实车部署教程

强化學習仿真實車部署 前言 这里讲一下如何部署 有两种方式部署&#xff1a; 第一种实车远程控制&#xff1a;即通过roscore中的IP设置实现远程控制&#xff1b;具体可以参考turtlebot3的PC连接turtlebot3并控制的教程&#xff1b;我使用的是这种方法&#xff1b; 第二种直…

一条命令重启supervisor所有RUNNING状态的进程

supervisorctl status | grep RUNNING | awk {print $1} | xargs -n1 supervisorctl restart

选择适合的项目管理系统,了解有哪些选择和推荐

随着科技的进步和全球竞争的加剧&#xff0c;项目管理已经成为企业成功的关键要素。为了更好地组织和监控项目&#xff0c;许多企业和组织正在采用项目管理系统(PMS)。本文将探讨项目管理系统的主要组成部分以及其在实际应用中的优势。 “项目管理系统有哪些?国际上比较常见的…