上一篇
在Java中访问网站可通过HttpURLConnection或第三方库如Apache HttpClient实现,基本步骤包括创建URL对象、打开连接、设置请求方法(如GET/POST)、添加请求头、获取响应流并读取数据,使用HttpURLConnection需处理异常和资源关闭,而HttpClient等库提供更简洁的API和连接管理功能。
在Java中访问网站(如发送HTTP请求、获取网页内容或调用API)是常见需求,尤其在数据采集、API集成或微服务场景中,以下是几种主流方法及详细实现,涵盖基础到高级应用,确保代码健壮性和安全性。
基础方法:使用 HttpURLConnection (JDK原生)
HttpURLConnection 是Java标准库的核心类,无需额外依赖,适合简单请求。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class BasicHttpRequest {
public static void main(String[] args) {
try {
// 1. 创建URL对象
URL url = new URL("https://example.com/api/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 2. 设置请求方法和超时
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000); // 5秒连接超时
conn.setReadTimeout(5000); // 5秒读取超时
// 3. 添加请求头(如User-Agent模拟浏览器)
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
// 4. 处理响应
int status = conn.getResponseCode();
if (status == 200) { // 成功响应
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream())
);
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("响应内容: " + response.toString());
} else {
System.out.println("请求失败,状态码: " + status);
}
// 5. 关闭连接
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
关键点:
- 异常处理:务必捕获
IOException,避免网络波动导致程序崩溃。 - 资源释放:在
finally块中关闭BufferedReader和disconnect()连接(示例简化)。 - HTTPS支持:默认支持HTTPS,但需注意证书校验(后文详述)。
高级方法:使用 HttpClient (Java 11+ 或 Apache)
1 Java 11+ 内置 HttpClient
JDK 11 引入现代化 HttpClient,支持异步请求和HTTP/2。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ModernHttpClient {
public static void main(String[] args) throws Exception {
// 1. 创建HttpClient
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 启用HTTP/2
.connectTimeout(Duration.ofSeconds(10))
.build();
// 2. 构建请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.header("User-Agent", "Java HttpClient")
.GET() // 默认GET,支持POST、PUT等
.build();
// 3. 发送请求(同步示例)
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
// 4. 输出结果
System.out.println("状态码: " + response.statusCode());
System.out.println("响应体: " + response.body());
}
}
2 Apache HttpClient (第三方库)
适用于旧版JDK或需要更复杂功能(如连接池、重试机制)。

添加依赖(Maven):
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
示例代码:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class ApacheHttpClientDemo {
public static void main(String[] args) {
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpGet request = new HttpGet("https://example.com");
request.setHeader("User-Agent", "Apache HttpClient");
try (CloseableHttpResponse response = client.execute(request)) {
String content = EntityUtils.toString(response.getEntity());
System.out.println("响应内容: " + content);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势:

- 连接池管理:复用TCP连接,提升性能。
- 自动重试:通过
HttpRequestRetryHandler处理临时故障。 - 灵活配置:支持代理、Cookie策略等。
关键注意事项与最佳实践
处理HTTPS证书问题
若网站使用自签名证书,需绕过证书验证(生产环境慎用):
// 示例:信任所有证书(仅测试环境使用)
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return null; }
}}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
超时设置
避免请求阻塞,必须设置:
// HttpURLConnection conn.setConnectTimeout(5000); // 连接超时 conn.setReadTimeout(10000); // 数据读取超时 // Java 11 HttpClient HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5));
用户代理(User-Agent)
未设置UA可能被网站拒绝访问:

conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
资源释放
确保关闭连接和流,防止资源泄漏:
finally {
if (reader != null) reader.close();
if (conn != null) conn.disconnect();
}
处理重定向
默认自动重定向,可手动控制:
// 禁用自动重定向
conn.setInstanceFollowRedirects(false);
// 检查重定向状态码(301/302)
if (status == 301 || status == 302) {
String newUrl = conn.getHeaderField("Location");
// 重新请求新URL
}
应用场景建议
- 简单脚本/学习:使用
HttpURLConnection。 - 高性能/生产环境:选择 Apache HttpClient 或 Java 11+
HttpClient。 - 异步需求:Java 11+
HttpClient的sendAsync()方法。 - 复杂逻辑:结合库如 OkHttp 或 Spring RestTemplate(Spring生态)。
安全与合规提醒
- 遵守Robots协议:访问前检查
robots.txt,避免非规爬取。 - 频率控制:添加延时(如
Thread.sleep(1000)),防止被封IP。 - 数据隐私:处理用户数据需符合 GDPR 等法规。
- 错误日志:记录异常信息,但避免暴露敏感数据。
通过以上方法,Java可高效安全地访问网站,根据需求选择合适方案,并始终优先考虑代码健壮性和法律合规性。
引用说明:本文代码示例基于Oracle官方文档、Apache HttpClient指南及Java社区最佳实践。
