1. 概述
本文将演示如何使用Apache HttpClient发送带有自定义User-Agent头的HTTP请求。这个技巧在需要模拟特定浏览器行为或绕过服务器端User-Agent检测时特别实用。
2. 在HttpClient全局设置User-Agent
我们可以直接在构建客户端时设置全局User-Agent,这样所有请求都会使用相同的标识:
HttpClients.custom().setUserAgent("Mozilla/5.0 Firefox/26.0").build();
完整示例代码如下:
@Test
void whenClientUsesCustomUserAgent_thenCorrect() throws IOException {
CloseableHttpClient client = HttpClients.custom()
.setUserAgent("Mozilla/5.0 Firefox/26.0")
.build();
final HttpGet request = new HttpGet(SAMPLE_URL);
String response = client.execute(request, new BasicHttpClientResponseHandler());
logger.info("Response -> {}", response);
}
✅ 优点:
- 一次设置,全局生效
- 适合需要统一User-Agent的场景
⚠️ 注意:
- 这种方式会覆盖所有请求的User-Agent
- 后续无法针对特定请求修改
3. 在单个请求上设置User-Agent
如果需要更灵活的控制,可以为每个请求单独设置User-Agent头:
@Test
void whenRequestHasCustomUserAgent_thenCorrect() throws IOException {
CloseableHttpClient client = HttpClients.createDefault();
final HttpGet request = new HttpGet(SAMPLE_URL);
request.setHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 Firefox/26.0");
String response = client.execute(request, new BasicHttpClientResponseHandler());
logger.info("Response -> {}", response);
}
✅ 优点:
- 每个请求可独立配置
- 适合需要动态切换User-Agent的场景
❌ 缺点:
- 每个请求都需要显式设置
- 代码重复度可能较高
4. 总结
本文展示了使用Apache HttpClient发送自定义User-Agent请求的两种方式:
- 全局配置(适合统一场景)
- 单请求配置(适合灵活场景)
这些技巧在以下场景特别有用:
- 模拟浏览器行为
- 绕过服务器端User-Agent检测
- API调用时的身份伪装
所有示例代码可在GitHub项目中找到,这是一个基于Eclipse的项目,可以直接导入运行。