HttpClient 迎来Java 11 可用的 JDK 内置的 HTTP 客户端

在 Java 11 之前,开发者通常需要依赖第三方库(如 Apache HttpClient 或 OkHttp)来实现 HTTP 客户端功能。Java 11 引入了全新的 HttpClient API,这是 JDK 内置的 HTTP 客户端,为开发者提供了强大的工具来处理 HTTP 请求和响应。本文将深入探讨 Java 11 的 HttpClient,包括其特性、使用方法、常见用例和优势。

HttpClient 的特性

Java 11 的 HttpClient API 提供了现代化、便捷和高效的 HTTP 通信功能。以下是其主要特性:

  1. 异步操作支持:支持同步和异步的 HTTP 请求处理,提供更灵活的编程模型。
  2. HTTP/2 支持:原生支持 HTTP/2 协议,带来更高效的网络通信。
  3. 简洁的 API:提供简洁明了的 API,简化 HTTP 请求的构建和处理过程。
  4. 多种认证机制:支持基本认证、摘要认证、NTLM、SPNEGO 和 Kerberos 等多种认证机制。
  5. 响应处理流:使用 CompletableFuture 处理异步响应,支持响应流的直接处理。

使用 HttpClient

要使用 Java 11 的 HttpClient,需要导入相应的类,并按照以下步骤构建和发送 HTTP 请求:

  1. 创建 HttpClient 对象
  2. 构建 HttpRequest 对象
  3. 发送请求并处理响应

以下示例展示了如何使用 HttpClient 发送 GET 请求并处理响应:

示例:发送 GET 请求

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientExample {
    public static void main(String[] args) {
        try {
            // 创建 HttpClient 对象
            HttpClient client = HttpClient.newHttpClient();

            // 构建 HttpRequest 对象
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(new URI("https://api.example.com/data"))
                    .GET()
                    .build();

            // 发送请求并获取响应
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 输出响应状态码和响应体
            System.out.println("Status code: " + response.statusCode());
            System.out.println("Response body: " + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,首先创建 HttpClient 对象,然后使用 HttpRequest 构建 GET 请求,最后通过 HttpClient 发送请求并获取响应。响应结果通过 HttpResponse 对象进行处理。

示例:发送 POST 请求

除了 GET 请求,HttpClient 还支持发送 POST 请求。以下示例展示了如何发送带有 JSON 数据的 POST 请求:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.StandardCharsets;

public class PostRequestExample {
    public static void main(String[] args) {
        try {
            // 创建 HttpClient 对象
            HttpClient client = HttpClient.newHttpClient();

            // 构建 JSON 数据
            String json = "{ \"name\": \"John\", \"age\": 30 }";

            // 构建 HttpRequest 对象
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(new URI("https://api.example.com/create"))
                    .header("Content-Type", "application/json")
                    .POST(BodyPublishers.ofString(json, StandardCharsets.UTF_8))
                    .build();

            // 发送请求并获取响应
            HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

            // 输出响应状态码和响应体
            System.out.println("Status code: " + response.statusCode());
            System.out.println("Response body: " + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,POST 请求携带 JSON 数据,构建 HttpRequest 时使用 POST 方法,并通过 BodyPublishers 设置请求体内容。

异步请求

HttpClient 提供了异步请求处理能力,可以使用 CompletableFuture 处理异步响应。以下示例展示了如何发送异步 GET 请求:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class AsyncRequestExample {
    public static void main(String[] args) {
        try {
            // 创建 HttpClient 对象
            HttpClient client = HttpClient.newHttpClient();

            // 构建 HttpRequest 对象
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(new URI("https://api.example.com/data"))
                    .GET()
                    .build();

            // 发送异步请求并处理响应
            CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

            responseFuture.thenAccept(response -> {
                // 输出响应状态码和响应体
                System.out.println("Status code: " + response.statusCode());
                System.out.println("Response body: " + response.body());
            }).join();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,使用 sendAsync 方法发送异步请求,CompletableFuture 提供了非阻塞式的响应处理方式。

常见用例

处理响应头

可以通过 HttpResponse 对象获取响应头:

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
response.headers().map().forEach((k, v) -> System.out.println(k + ":" + v));

使用代理

HttpClient 支持代理设置,以下示例展示了如何配置 HTTP 代理:

HttpClient client = HttpClient.newBuilder()
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 8080)))
        .build();

处理超时

可以为请求配置超时设置:

HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("https://api.example.com/data"))
        .timeout(Duration.ofSeconds(10))
        .GET()
        .build();

优势

  1. 内置支持:无需依赖第三方库,简化了项目依赖管理。
  2. 现代化特性:支持 HTTP/2、异步编程和多种认证机制,满足现代 Web 应用需求。
  3. 简洁易用:提供简洁明了的 API,易于学习和使用。

总结

Java 11 引入的 HttpClient API 为开发者提供了强大的 HTTP 客户端功能,简化了 HTTP 请求的构建和处理过程。通过支持同步和异步操作、HTTP/2 协议、认证机制和响应处理流,HttpClient 为现代 Java 开发者提供了便捷和高效的解决方案。在实际开发中,合理使用 HttpClient,可以显著提升 HTTP 通信的性能和开发效率。

建站托管

系统采用Java语言编程,数据库与页面服务器完全分离,在快速与稳定的同时更加安全

方式1

¥联系洽谈 / 月

  • 三加一部署
  • 美国、香港或台湾骨干机房
  • 抗攻击.服务器采用异地双备份
  • 无优7x24服务
  • 日常维护及更新

方式3

¥联系洽谈 / 月

  • 三加一部署
  • 美国、香港或台湾骨干机房
  • 抗攻击.服务器采用异地双备份
  • 无优7x24服务
  • 日常维护及更新
超值

方式4

¥联系洽谈 / 月

  • 三加一部署
  • 美国、香港或台湾骨干机房
  • 抗攻击.服务器采用异地双备份
  • 无优7x24服务
  • 日常维护及更新

软件系统研发

自主管理机房、99.99%在线率保障,无优7x24服务,为您提供尊贵服务与解决方案

中原三合一六仔平台
中原三合一六仔平台

中原三合一系统是一个信用类型六仔租用平台,支持多盘口的系统,最近我们根据在使用的客户提出需求迭代更新…