Spring Boot 发送 HTTP 请求

1. 前言

在现代的互联网应用中,经常需要与其他的服务进行通信。而 HTTP 是目前应用最广泛的传输协议之一。Spring Boot 是一个为了简化 Spring 应用开发而生的框架,它提供了很多便利的功能,其中包括发送 HTTP 请求。本文将介绍如何使用 Spring Boot 发送 HTTP 请求,并提供一些常见的代码示例。

2. HTTP 请求的发送方式

在 Spring Boot 中,发送 HTTP 请求有多种方式,可以根据具体的需求选择合适的方式。

2.1 使用 RestTemplate

RestTemplate 是 Spring 提供的一个用于发送 HTTP 请求的类。它封装了发送请求、处理响应的逻辑,并提供了一些便捷的方法,如 getForObjectpostForObject 等。

下面是一个使用 RestTemplate 发送 GET 请求的示例:

import org.springframework.web.client.RestTemplate;

RestTemplate restTemplate = new RestTemplate();
String url = "
String response = restTemplate.getForObject(url, String.class);

上面的代码使用 RestTemplate 发送了一个 GET 请求,并将响应结果以字符串的形式返回。

2.2 使用 WebClient

WebClient 是 Spring 5 引入的一个用于发送 HTTP 请求的类。相比于 RestTemplate,WebClient 更加灵活,可以使用流式 API 构建请求,并支持异步操作。

下面是一个使用 WebClient 发送 POST 请求的示例:

import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.http.MediaType;

WebClient webClient = WebClient.create();
String url = "
String requestBody = "{\"name\":\"John\", \"age\":30}";
String response = webClient.post()
    .uri(url)
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(requestBody)
    .retrieve()
    .bodyToMono(String.class)
    .block();

上面的代码使用 WebClient 发送了一个 POST 请求,并将响应结果以字符串的形式返回。

3. 使用场景和示例

3.1 获取远程数据

在很多场景下,我们需要从远程服务获取数据。下面是一个使用 RestTemplate 获取用户信息的示例:

import org.springframework.web.client.RestTemplate;

RestTemplate restTemplate = new RestTemplate();
String url = "
User user = restTemplate.getForObject(url, User.class);

上面的代码通过发送 GET 请求,获取了 ID 为 1 的用户信息,并将响应结果映射为 User 对象。

3.2 发送表单数据

有时候,我们需要向远程服务发送表单数据,用于提交用户的输入或进行身份验证等操作。下面是一个使用 WebClient 发送表单数据的示例:

import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

WebClient webClient = WebClient.create();
String url = "
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("username", "john");
formData.add("password", "password");
String response = webClient.post()
    .uri(url)
    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
    .bodyValue(formData)
    .retrieve()
    .bodyToMono(String.class)
    .block();

上面的代码通过发送 POST 请求,将表单数据提交给远程服务,并获取响应结果。

3.3 异步操作

在某些场景下,我们需要并发地发送多个 HTTP 请求,这时可以使用 WebClient 的异步操作来提升性能。下面是一个使用 WebClient 异步发送 HTTP 请求的示例:

import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
import reactor.core.publisher.Mono;

WebClient webClient = WebClient.create();
String url1 = "
String url2 = "

Mono<String> response1 = webClient.get()
    .uri(url1)
    .retrieve()
    .bodyToMono(String.class);

Mono<String> response2 = webClient.get()
    .uri(url2)
    .retrieve()
    .bodyToMono(String.class);

Mono.zip(response1, response2)
    .subscribe(results -> {
        String user1 = results.getT1();
        String user2 = results.getT2();
        // 处理响应结果