Java HTTP客户端:从A到Z正确发起请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么Java中需要HTTP客户端?

\n\n

现代Java开发几乎离不开与外部服务的交互。无论是向服务器发送数据、从REST API获取信息,还是与云平台集成——处处都需要HTTP客户端。在Java中,有多种方式可以执行HTTP请求,选择正确的方法至关重要。

\n\n

长期以来,标准工具是java.net.HttpURLConnection库,但随着Java 11的发布,出现了一个更新、更便捷的模块java.net.http。在本文中,我们将全面解析Java HTTP客户端的使用:从简单的GET请求到发送JSON和处理错误。

\n\n

本文面向已熟悉Java基础、但希望系统化掌握网络请求知识的开发者。我们将使用Java 11+内置的HttpClient,因为这是现代且推荐的方法。

\n\n

1. HTTP客户端基础:创建与配置

\n\n

在发送请求之前,需要创建HttpClient实例。这是执行所有HTTP操作的核心对象。我们来看基本配置。

\n\n

创建客户端

\n\n

最简单的方式是使用静态方法newHttpClient():

\n\n
import java.net.http.HttpClient;\n\nHttpClient client = HttpClient.newHttpClient();
\n\n

然而,在实际项目中,通常需要配置超时、协议版本或代理。以下是扩展配置的示例:

\n\n
import 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
\n\n

请注意:一个HttpClient实例可用于多个请求。它是线程安全的,因此可以创建一次并在整个应用程序中重复使用。

\n\n

2. 创建和发送HTTP请求

\n\n

现在进入重点——构建请求。在Java 11+中,使用HttpRequest类。我们来看主要的请求类型。

\n\n

GET请求:获取数据

\n\n

GET是最简单的请求类型。用于从服务器获取数据。示例:

\n\n
import 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\n

send()方法执行同步请求。如果需要异步执行,请使用sendAsync(),它返回CompletableFuture。

\n\n

POST请求:发送数据

\n\n

POST用于向服务器发送数据。最常见的是JSON或表单数据。我们来看两种方式。

\n\n

带JSON的POST:

\n\n
import java.net.http.HttpRequest.BodyPublishers;\n\nString json = "{\\"name\\":\\"伊万\\",\\"email\\":\\"iva                

博客

书籍推荐