引言:为什么Java中需要HTTP客户端?
\n\n现代Java开发几乎离不开与外部服务的交互。无论是向服务器发送数据、从REST API获取信息,还是与云平台集成——处处都需要HTTP客户端。在Java中,有多种方式可以执行HTTP请求,选择正确的方法至关重要。
\n\n长期以来,标准工具是java.net.HttpURLConnection库,但随着Java 11的发布,出现了一个更新、更便捷的模块java.net.http。在本文中,我们将全面解析Java HTTP客户端的使用:从简单的GET请求到发送JSON和处理错误。
本文面向已熟悉Java基础、但希望系统化掌握网络请求知识的开发者。我们将使用Java 11+内置的HttpClient,因为这是现代且推荐的方法。
1. HTTP客户端基础:创建与配置
\n\n在发送请求之前,需要创建HttpClient实例。这是执行所有HTTP操作的核心对象。我们来看基本配置。
创建客户端
\n\n最简单的方式是使用静态方法newHttpClient():
import java.net.http.HttpClient;\n\nHttpClient client = HttpClient.newHttpClient();\n\n然而,在实际项目中,通常需要配置超时、协议版本或代理。以下是扩展配置的示例:
\n\nimport java.net.http.HttpClient;\nimport java.time.Duration;\n\nHttpClient client = HttpClient.newBuilder()\n .version(HttpClient.Version.HTTP_2) // 使用HTTP/2\n .connectTimeout(Duration.ofSeconds(10)) // 连接超时\n .followRedirects(HttpClient.Redirect.NORMAL) // 自动跟随重定向\n .build();\n\n重要配置参数
\n\n- \n
- version — 选择HTTP/1.1或HTTP/2(默认HTTP/2,如果服务器支持) \n
- connectTimeout — 连接等待的最大时间 \n
- followRedirects — 重定向处理策略(NEVER, ALWAYS, NORMAL) \n
- proxy — 代理服务器配置(如果需要) \n
请注意:一个HttpClient实例可用于多个请求。它是线程安全的,因此可以创建一次并在整个应用程序中重复使用。
2. 创建和发送HTTP请求
\n\n现在进入重点——构建请求。在Java 11+中,使用HttpRequest类。我们来看主要的请求类型。
GET请求:获取数据
\n\nGET是最简单的请求类型。用于从服务器获取数据。示例:
\n\nimport java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\nHttpRequest request = HttpRequest.newBuilder()\n .uri(URI.create("https://api.example.com/users"))\n .GET() // 明确指定方法(可省略,GET为默认)\n .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n\nSystem.out.println("状态码: " + response.statusCode());\nSystem.out.println("响应体: " + response.body());\n\nsend()方法执行同步请求。如果需要异步执行,请使用sendAsync(),它返回CompletableFuture。
POST请求:发送数据
\n\nPOST用于向服务器发送数据。最常见的是JSON或表单数据。我们来看两种方式。
\n\n带JSON的POST:
\n\nimport java.net.http.HttpRequest.BodyPublishers;\n\nString json = "{\\"name\\":\\"伊万\\",\\"email\\":\\"iva