SpringBoot使用RestTemplate发送http请求的实操演示

 更新时间:2024年11月01日 10:26:55   作者:Eric-x  
RestTemplate是Spring 框架提供的 ,可用于在应用中调用 rest 服务,它简化了与 http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接,本文给大家介绍了SpringBoot使用RestTemplate发送http请求的实操演示,需要的朋友可以参考下

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

  • 原始httpClient
  • RestTemplate
  • 第三方库,例如 OKHttp,Hutool等

本文着重介绍RestTemplate方式

2、什么是RestTemplate

RestTemplate是Spring 框架提供的 ,可用于在应用中调用 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;
    }

}


总结

到此这篇关于SpringBoot使用RestTemplate发送http请求的实操演示的文章就介绍到这了,更多相关SpringBoot RestTemplate发送http请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java利用MessageFormat实现短信模板的匹配

    Java利用MessageFormat实现短信模板的匹配

    这篇文章主要介绍了Java利用MessageFormat实现短信模板的匹配,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 不知道面试会不会问Lambda怎么用(推荐)

    不知道面试会不会问Lambda怎么用(推荐)

    这篇文章主要介绍了Lambda表达式用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • spring使用validation参数及全局异常检测方式

    spring使用validation参数及全局异常检测方式

    本文主要介绍了Java的数据校验规范validation-api,包括其定义的注解和HibernateValidator的实现,还介绍了spring-boot-starter-validation的使用,可以让开发者在SpringBoot应用中简化数据校验的功能
    2025-02-02
  • 如何用Spring发送电子邮件

    如何用Spring发送电子邮件

    这篇文章主要介绍了如何用Spring发送电子邮件,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Java 类与对象详细

    Java 类与对象详细

    这篇文章主要介绍了Java 类与对象,在Java中,我们把对象的特征称为属性,对象的用途称为方法,具有相同属性和方法的对象,我们把他们归为一类,简称类。下面文章讲详细介绍什么是Java类与对象,需要的朋友可以参考一下
    2021-10-10
  • SpringBoot中@RestControllerAdvice注解的使用

    SpringBoot中@RestControllerAdvice注解的使用

    这篇文章主要介绍了SpringBoot中@RestControllerAdvice注解的使用,@RestControllerAdvice主要用精简客户端返回异常,它可以捕获各种异常,需要的朋友可以参考下
    2024-01-01
  • 如何设置Spring Boot测试时的日志级别

    如何设置Spring Boot测试时的日志级别

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。下面我们来一起学习一下吧
    2019-06-06
  • iReport生成pdf打印的实例代码

    iReport生成pdf打印的实例代码

    下面小编就为大家分享一篇iReport生成pdf打印的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Servlet关于RequestDispatcher的原理详解

    Servlet关于RequestDispatcher的原理详解

    这篇文章主要介绍了Servlet关于RequestDispatcher的原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 23种设计模式(1) java单例模式

    23种设计模式(1) java单例模式

    这篇文章主要为大家详细介绍了23种设计模式之java单例模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论