如何使用 RestTemplate 调用 RESTful API

news2024/10/7 12:25:57

如何使用 RestTemplate 调用 RESTful API?

在开发 Web 应用程序时,调用 RESTful API 是一个常见的任务。为了调用 RESTful API,我们需要使用 HTTP 协议向 API 发送请求,并解析 API 返回的响应。为了简化这个过程,可以使用 Spring Framework 提供的 RestTemplate 类。本文将介绍如何使用 RestTemplate 调用 RESTful API,并提供示例代码。

在这里插入图片描述

什么是 RestTemplate?

RestTemplate 是 Spring Framework 提供的一个用于调用 RESTful API 的工具。RestTemplate 封装了对 HTTP 协议的访问,可以发送 HTTP 请求并解析 HTTP 响应。RestTemplate 支持多种 HTTP 方法(例如 GET、POST、PUT、DELETE 等),并提供了多种选项(例如请求头、请求参数等)来满足不同的需求。RestTemplate 简化了调用 RESTful API 的过程,避免了手动处理 HTTP 协议的复杂性。

如何使用 RestTemplate?

使用 RestTemplate 调用 RESTful API 的步骤如下:

  1. 创建 RestTemplate 实例

首先,需要创建一个 RestTemplate 实例。可以使用 Spring Boot 的自动配置来创建 RestTemplate 实例,或者手动创建 RestTemplate 实例。例如,下面是一个手动创建 RestTemplate 实例的示例代码:

RestTemplate restTemplate = new RestTemplate();

在上述示例代码中,我们使用了默认的构造函数来创建 RestTemplate 实例。也可以使用其他构造函数来配置 RestTemplate 实例,例如指定 HttpClient、HttpMessageConverter 等。

  1. 发送 HTTP 请求

使用 RestTemplate 发送 HTTP 请求,可以调用 RestTemplate 的方法来发送不同类型的 HTTP 请求,例如 GET、POST、PUT、DELETE 等。例如,下面是一个使用 RestTemplate 发送 GET 请求的示例代码:

String url = "https://api.example.com/users/{id}";
Map<String, String> params = new HashMap<>();
params.put("id", "123");
User user = restTemplate.getForObject(url, User.class, params);

在上述示例代码中,我们使用了 RestTemplate 的 getForObject 方法来发送 GET 请求,并将响应解析为 User 对象。getForObject 方法的第一个参数是请求的 URL,可以包含占位符(例如 {id}),占位符的值可以在第三个参数中指定。getForObject 方法的第二个参数是响应的类型,可以是任何 Java 类型,例如 String、Integer、List、Map 等。

可以使用 RestTemplate 的其他方法来发送 POST、PUT、DELETE 等类型的 HTTP 请求,例如:

  • postForObject:发送 POST 请求,并返回响应的对象。
  • put:发送 PUT 请求,并返回响应的对象。
  • delete:发送 DELETE 请求,并返回响应的对象。
  • exchange:发送任意类型的 HTTP 请求,并返回响应的对象。

例如,下面是一个使用 RestTemplate 发送 POST 请求的示例代码:

String url = "https://api.example.com/users";
User user = new User("张三", 18);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<User> requestEntity = new HttpEntity<>(user, headers);
User createdUser = restTemplate.postForObject(url, requestEntity, User.class);

在上述示例代码中,我们使用了 RestTemplate 的 postForObject 方法来发送 POST 请求,并将请求体设置为 User 对象。为了设置请求体的类型,我们需要创建一个 HttpEntity 对象,并将 User 对象和请求头设置为 HttpEntity 的属性。

  1. 处理 HTTP 响应

使用 RestTemplate 发送 HTTP 请求后,可以使用 RestTemplate 的方法来处理 HTTP 响应。例如,可以使用 getForObject 方法来将响应解析为对象,或者使用 exchange 方法来获取完整的 HTTP 响应。例如,下面是一个使用 RestTemplate 处理 GET 请求响应的示例代码:

String url = "https://api.example.com/users/{id}";
Map<String, String> params = new HashMap<>();
params.put("id", "123");
ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class, params);
HttpStatus statusCode = responseEntity.getStatusCode();
User user =responseEntity.getBody();

在上述示例代码中,我们使用了 RestTemplate 的 getForEntity 方法来发送 GET 请求,并获取完整的 HTTP 响应。getForEntity 方法的返回值是一个 ResponseEntity 对象,包含了 HTTP 响应的状态码、响应头和响应体。我们可以使用 getStatusCode 方法获取 HTTP 响应的状态码,使用 getBody 方法获取响应体,并将其解析为 User 对象。

除了 getForEntity 方法外,还可以使用 postForEntityputdeleteexchange 等方法来处理 HTTP 响应。

  1. 错误处理

在使用 RestTemplate 调用 RESTful API 时,可能会发生一些错误,例如网络错误、HTTP 错误等。为了处理这些错误,可以使用 try-catch 块或使用 Spring Framework 提供的异常处理机制。例如,下面是一个使用 try-catch 块处理 HTTP 错误的示例代码:

String url = "https://api.example.com/users/{id}";
Map<String, String> params = new HashMap<>();
params.put("id", "123");
try {
    User user = restTemplate.getForObject(url, User.class, params);
} catch (HttpClientErrorException e) {
    HttpStatus statusCode = e.getStatusCode();
    String responseBody = e.getResponseBodyAsString();
    // 处理 HTTP 错误
} catch (RestClientException e) {
    // 处理其它错误
}

在上述示例代码中,我们使用了 try-catch 块来处理 HTTP 错误。如果发生 HTTP 错误,会抛出 HttpClientErrorException 异常,可以使用 getStatusCodegetResponseBodyAsString 方法来获取 HTTP 响应的状态码和响应体。

示例代码

下面是一个完整的示例代码,演示如何使用 RestTemplate 调用 RESTful API:

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

public class RestTemplateDemo {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();

        // 发送 GET 请求
        String url = "https://api.example.com/users/{id}";
        Map<String, String> params = new HashMap<>();
        params.put("id", "123");
        User user = restTemplate.getForObject(url, User.class, params);
        System.out.println(user);

        // 发送 POST 请求
        url = "https://api.example.com/users";
        User newUser = new User("张三", 18);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<User> requestEntity = new HttpEntity<>(newUser, headers);
        User createdUser = restTemplate.postForObject(url, requestEntity, User.class);
        System.out.println(createdUser);

        // 处理 HTTP 响应
        url = "https://api.example.com/users/{id}";
        params = new HashMap<>();
        params.put("id", "123");
        ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class, params);
        HttpStatus statusCode = responseEntity.getStatusCode();
        User retrievedUser = responseEntity.getBody();
        System.out.println(statusCode);
        System.out.println(retrievedUser);

        // 错误处理
        url = "https://api.example.com/nonexistent";
        try {
            String result = restTemplate.getForObject(url, String.class);
            System.out.println(result);
        } catch (HttpClientErrorException e) {
            HttpStatus errorStatus = e.getStatusCode();
            String errorBody = e.getResponseBodyAsString();
            System.out.println(errorStatus);
            System.out.println(errorBody);
        } catch (RestClientException e) {
            e.printStackTrace();
        }
    }

    static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

在上述示例代码中,我们首先创建了一个 RestTemplate 实例,然后演示了如何使用 RestTemplate 发送 GET 请求、POST 请求,并处理 HTTP 响应和错误。

## RestTemplate 的配置

使用 RestTemplate 调用 RESTful API 时,可以通过配置 RestTemplate 实例来满足不同的需求。例如,可以配置 RestTemplate 的请求工厂、拦截器、消息转换器等。下面介绍几种常用的 RestTemplate 配置方法。

配置请求工厂

RestTemplate 使用 ClientHttpRequestFactory 接口来创建 HTTP 请求。默认情况下,RestTemplate 使用 SimpleClientHttpRequestFactory 实现来创建 HTTP 请求,可以通过设置连接超时和读取超时等参数来控制 HTTP 请求的行为。如果需要更高级的功能,例如连接池、SSL 支持等,可以使用其他实现类来替换 SimpleClientHttpRequestFactory 实现。

以下是一个示例代码,演示如何使用 HttpComponentsClientHttpRequestFactory 替换默认的 SimpleClientHttpRequestFactory 实现:

CloseableHttpClient httpClient = HttpClients.custom()
        .setDefaultRequestConfig(RequestConfig.custom()
                .setConnectTimeout(5000)
                .setSocketTimeout(5000)
                .build())
        .build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);

在上述示例代码中,我们首先使用 HttpComponentsClientHttpRequestFactory 类创建一个请求工厂,然后将其传递给 RestTemplate 构造函数。HttpComponentsClientHttpRequestFactory 类使用 Apache HttpComponents 库实现,支持连接池、SSL 支持等高级功能。

配置拦截器

RestTemplate 支持添加拦截器来对 HTTP 请求进行处理。拦截器可以在发送 HTTP 请求前和收到 HTTP 响应后进行处理,例如添加请求头、记录请求日志等。

以下是一个示例代码,演示如何使用 ClientHttpRequestInterceptor 接口添加一个请求拦截器:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList((request, body, execution) -> {
    request.getHeaders().add("Authorization", "Bearer token");
    return execution.execute(request, body);
}));

在上述示例代码中,我们添加了一个请求拦截器,它会在发送 HTTP 请求前添加一个 Authorization 请求头,值为 Bearer token。

配置消息转换器

RestTemplate 使用 HttpMessageConverter 接口来处理 HTTP 请求和响应的消息。默认情况下,RestTemplate 提供了多个内置的消息转换器,例如 StringHttpMessageConverter、MappingJackson2HttpMessageConverter 等。如果需要支持其他类型的消息,例如 XML、Protobuf 等,可以添加自定义的消息转换器。

以下是一个示例代码,演示如何添加一个自定义的消息转换器:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Collections.singletonList(new MyHttpMessageConverter()));

在上述示例代码中,我们添加了一个自定义的消息转换器 MyHttpMessageConverter,它实现了 HttpMessageConverter 接口,可以将自定义的消息类型转换为 HTTP 请求和响应的消息。

总结

使用 RestTemplate 调用 RESTful API 是一种常见的任务,可以使用 Spring Framework 提供的 RestTemplate 类来简化这个过程。RestTemplate 封装了对 HTTP 协议的访问,可以发送 HTTP 请求并解析 HTTP 响应,支持多种 HTTP 方法和选项。RestTemplate 的使用步骤包括创建 RestTemplate 实例、发送 HTTP 请求、处理 HTTP 响应和错误处理。RestTemplate 还支持多种配置选项,例如配置请求工厂、拦截器和消息转换器等。使用 RestTemplate 可以简化调用 RESTful API 的过程,提高开发效率。

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

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

相关文章

为生信写的Python简明教程 | 视频6

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

【前端特效篇】过渡与动画

变形和动画都是前端开发过程中&#xff0c;用来提高用户体验的一种方式。增加一些动效&#xff0c;可以使页面看起来不那么枯燥无味。 一、变形 transform transform 属性应用于元素的2D或3D转换。这个属性允许你将元素旋转&#xff0c;缩放&#xff0c;移动&#xff0c;倾斜…

opencloudos安装nginx新版本

opencloudos基本上完全兼容centos的操作&#xff0c;源管理方式也适用的yum。 ​ 装了一个opencloudos之后&#xff0c;想安装一下nginx。 默认的情况下安装使用&#xff1a; yum install nginx不过默认安装的是 1.14 版本&#xff0c;这个版本有几个 http 的漏洞&#xff…

【JUC进阶】03. Java对象头和内存布局

1、前言 为了后面更好的学习锁优化以及运作过程&#xff0c;需要我们对HotSpot虚拟机的Java对象内存布局有一定的了解&#xff0c;也作为技术储备。 2、对象的内存布局 在HotSpot虚拟机中&#xff0c;对象在堆内存中存储的布局可以划分为三个部分&#xff1a;对象头&#xf…

逍遥子All in阿里云,阿里“压舱石”与“秘密武器”接任

激荡中的阿里&#xff0c;又宣布了组织变革的最新进展&#xff1a;张勇将在2023年9月10日卸任阿里巴巴控股集团董事会主席兼CEO职务&#xff0c;此后将专职担任阿里云智能集团董事长兼CEO。蔡崇信将接任阿里集团董事长&#xff0c;吴泳铭出任阿里集团CEO并继续兼任淘天集团董事…

Linux 学习记录37(C高级篇)

Linux 学习记录37(C高级篇) 本文目录 Linux 学习记录37(C高级篇)一、常见的shell解析器二、变量1. shell脚本外部传参2. 输入输出(1. 输出(2. 输入 3. 命令置换符4. shell中的数组 三、shell中的算数运算1. (())运算2. $[ ]运算3. let运算4. expr指令(1.数据运算(3. 字符运算 四…

STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习(AD单通道和AD多通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

港科夜闻|香港科大(广州)INNOTECH创科嘉年华暨周年庆典隆重举行

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大(广州)INNOTECH创科嘉年华暨周年庆典隆重举行。6月16日&#xff0c;在《广州南沙深化面向世界的粤港澳全面合作总体方案》印发一周年之际&#xff0c;作为《南沙方案》发布后落成的第一个重大项目&#xff0c;香…

深入理解生成式AI技术原理:初识生成式AI

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

三菱plc编程协议开发记录

目录 1 协议介绍 2 测试报文 3 PLC服务端仿真 4 java测试代码 1 协议介绍 Fx_Serial 通过Fx编程口协议连接三菱FX0N、FX1N、FX2N、FX3U FX3G、FX3S系列PLC。协议的详细介绍文档见附件“FX编程口协议.pdf”。 2 测试报文 组装各种类型报文测试&#xff0c;见附件“报文.xls…

Spring MVC框架步骤

目录 前言1. 配置开发环境2. 创建一个新的Maven项目3. 配置Web.xml文件4. 创建控制器类5. 创建视图6. 配置视图解析器7. 运行应用程序8. 测试应用程序 前言 Spring MVC是一种基于Java的Web应用程序开发框架&#xff0c;它可以帮助开发人员构建灵活、健壮和可扩展的Web应用程序…

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…

hive/spark数据倾斜解决方案

Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在&#xff0c;mapreduce程序执行时&#xff0c;reduce节点大部分执行完毕&#xff0c;但是有一个或者几个reduce节点运行很慢&#xff0c;导致整个程序的处理时间很长&#xff0c;这是因为某一个key的条数比其他…

stm32驱动RFID高频读卡器读取IC卡

stm32驱动RFID读卡器读取IC卡 1.介绍RFID2.RFID控制指令2.1 读IC卡号2.2 读IC卡数据块2.3 写数据到IC卡数据块2.4 读取RFID读卡器用户数据2.5 向RFID读卡器写入用户数据 3.代码实例3.1 rfid.c 源文件3.2 rfid 头文件 4. 结语 1.介绍RFID RFID&#xff08;Radio-Frequency Iden…

篮球比赛管理系统的设计与实现(论文+源码)_kaic

摘要 迅猛发展并日益成熟的网络已经彻底的影响了我们的方方面面。人们也确实真切的体会到了网络带给我们的便捷。本网站的设计理念在于作为一个天津大学生台球联盟推广网&#xff0c;就是能够尽可能详细地展示、介绍台球联盟资讯信息&#xff0c;播放视频&#xff0c;同时为广…

关于Eclipse代码断点调试与相关快捷键

关于Eclipse代码断点调试与相关快捷键 功能快捷键 首先关于DeBug测试的快捷键&#xff1a; Debug F5&#xff1a;Step Into&#xff08;debug&#xff09; F6&#xff1a;Step over&#xff08;debug&#xff09; F7&#xff1a;Step return&#xff08;debug&#xff09; F8&a…

化妆品行业知识分享

目录 一、产品基本信息 1.产品的组成 2. 产品分类 3.常见术语 二、产品特性 1.生产特性 2.销售特性 3.采购特性 4.研发特性 三、行业痛点与解决方案 1.行业主要存在的痛点 2.日常业务解决方案&#xff1a; 3.供应商管理解决方案&#xff1a; 四、总结 一、产品基本信息 1.产品的…

C++基础(13)——STL(stack、queue、list)

前言 本文主要介绍C中STL中的stack、queue和list容器 7.5&#xff1a;stack容器 7.5.1&#xff1a;stack容器基本概念 栈中只有顶端元素才可以被外界调用&#xff0c;因此栈不允许有遍历的行为&#xff0c;其中string、vector、deque都可以遍历 7.5.2&#xff1a;栈的常用接…

AT32F437网络通信

网络时间长了ping不通&#xff0c;解决方法 https :// https://hjha.bar:8443/vod 123456789 /play/id/32052/sid/1/nid/1.html

PYTHON强制升级openpyxl方法--已验证有效

当执行for i, row in enumerate(worksheet.iter_rows(min_row1, max_rowworksheet.max_row,values_onlyTrue)) 出现以下错误时&#xff1a;TypeError: iter_rows() got an unexpected keyword argument ‘values_only’ 说明openpyxl版本过低&#xff0c;需要升级&#xff0c;当…