怎么在 Java 中发送基础的 HTTP GET 请求(使用 HttpClient)

千枫酱_4671

千枫酱_4671

2026-04-27

972人浏览

原创

java 11+ 自带 httpclient 发送 get 请求需三步:构建 httpclient 实例、用 httprequest.newbuilder() 创建请求并调用 .get().uri(uri.create("url"))、通过 client.send() 同步获取 httpresponse;须显式处理 ioexception 和 interruptedexception,url 参数需用 urlencoder.encode() 编码,响应体乱码时应显式指定字符集。

怎么在 java 中发送基础的 http get 请求(使用 httpclient)

Java 11+ 自带 HttpClient 怎么发 GET 请求

Java 11 起,java.net.http.HttpClient 成为标准库一部分,无需额外依赖。它比 HttpURLConnection 更简洁,比第三方库(如 OkHttp)更轻量,适合基础场景。

核心三步:构建 HttpClient 实例 → 构建 HttpRequest → 调用 send() 并处理响应。

常见错误是忽略异常类型:send() 抛出 IOException 和 InterruptedException,必须显式处理,不能只 catch Exception。

示例:

HttpClient client = HttpClient.newBuilder()
    .connectTimeout(Duration.ofSeconds(5))
    .build();
<p>HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("<a href="https://www.php.cn/link/4d2fe2e8601f7a8018594d98f28706f2">https://www.php.cn/link/4d2fe2e8601f7a8018594d98f28706f2</a>"))
.GET()
.build();</p><p>HttpResponse<string> response = client.send(request,
HttpResponse.BodyHandlers.ofString());</string></p><p>System.out.println(response.statusCode()); // 200
System.out.println(response.body());       // JSON 响应体
</p>

怎么设置超时和重试逻辑

超时必须显式配置,否则默认无连接/读取超时,可能无限阻塞。注意:connectTimeout 只控制建连阶段,不控制整个请求生命周期。

重试需手动实现,HttpClient 不内置重试机制。简单重试可套一层循环 + 异常判断,但要注意避免幂等性问题(GET 一般安全,POST 则要谨慎)。

  • HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(3)):仅作用于 TCP 连接建立
  • 读取超时靠 HttpRequest.Builder.timeout() 控制,例如 .timeout(Duration.ofSeconds(10))
  • 重试建议加退避(如 Thread.sleep(100 * (i + 1))),并限制最大重试次数(如 3 次)
  • 捕获 IOException(网络失败、连接中断)可重试;InterruptedException 应传播或恢复中断状态

怎么处理中文 URL 或带参数的 GET 请求

URL 中含中文、空格、特殊字符必须编码,否则抛 URISyntaxException。别手拼字符串,用 URLEncoder.encode() 编码参数值,再组装;或更稳妥地用 UriBuilder(需引入 Jakarta EE API)——但纯 JDK 场景推荐手动编码。

示例(JDK 原生):

String baseUrl = "https://www.php.cn/link/4d2fe2e8601f7a8018594d98f28706f2";
String paramValue = "你好 world+test";
String encoded = URLEncoder.encode(paramValue, StandardCharsets.UTF_8);
URI uri = URI.create(baseUrl + "?q=" + encoded);
<p>HttpRequest request = HttpRequest.newBuilder()
.uri(uri)
.build();
</p>

注意:URLEncoder.encode() 会把空格转成 +,符合 application/x-www-form-urlencoded 规范,但 GET 请求中部分服务也接受 %20;只要服务端能解析,两者都可。别对整个 URL 调用 encode(),只编码参数值。

为什么响应体为空或乱码

常见原因是没指定字符集,HttpResponse.BodyHandlers.ofString() 默认用 UTF-8 解码,但若响应头 Content-Type 声明了其他编码(如 ISO-8859-1),就会乱码。

解决方法分两步:

  • 先检查 response.headers().firstValue("content-type"),看是否含 charset=
  • 用 BodyHandlers.ofString(StandardCharsets.UTF_8) 显式传入正确编码,或动态提取 charset 后构造 Charset
  • 如果响应体始终为空,确认服务端是否返回了 Content-Length: 0 或 Transfer-Encoding: chunked 且 body 真为空
  • 调试时可用 response.body().length() 和 response.headers().map() 打印原始信息,排除网络拦截或代理干扰

真正麻烦的是某些老服务返回的 header 不规范(比如缺失 charset、写错大小写),这时候得 fallback 到字节数组处理,再按经验 guess 编码。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10797

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7902

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6872

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2849

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20131

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习