Java HTTP Client API详解

张春  论坛元老 | 2025-4-18 03:25:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1575|帖子 1575|积分 4725

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Java HTTP Client API详解

Java的HTTP客户端API经历了多次演进,从早期的HttpURLConnection到第三方库如Apache HttpClient,再到Java 11引入的标准HttpClient。本文将全面解析Java中重要的HTTP客户端API,包括特性对比、使用方法和最佳实践。
一、Java HTTP客户端发展进程


  • 传统HttpURLConnection:自JDK 1.1引入,API计划陈旧,仅支持HTTP/1.1,同步阻塞模型,使用复杂 。
  • Apache HttpClient:功能丰富的第三方库,支持HTTP/1.1和HTTPS,提供连接池管理等高级特性 。
  • Java 11 HttpClient:Java 9引入孵化模块,Java 11正式发布,支持HTTP/2和WebSocket,提供同步/异步双模型 。
二、Java 11 HttpClient详解

核心类与特性

Java 11 HttpClient API包含三个核心类:


  • java.net.http.HttpClient:发送请求和处理响应的主类
  • java.net.http.HttpRequest:表现HTTP请求,配置URL、方法、头信息等
  • java.net.http.HttpResponse:表现服务器响应,包含状态码、头和响应体
重要特性:


  • 支持HTTP/1.1和HTTP/2协议
  • 同步阻塞和异步非阻塞双模型
  • 内置WebSocket支持
  • 链式API计划,代码简洁
  • 自动处理Cookie和重定向
根本使用示例

同步GET请求

  1. HttpClient client = HttpClient.newHttpClient();
  2. HttpRequest request = HttpRequest.newBuilder()
  3.         .uri(URI.create("https://api.example.com/data"))
  4.         .build();
  5. HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
  6. System.out.println(response.body());
复制代码
异步GET请求

  1. HttpClient client = HttpClient.newHttpClient();
  2. HttpRequest request = HttpRequest.newBuilder()
  3.         .uri(URI.create("https://api.example.com/data"))
  4.         .build();
  5. CompletableFuture<HttpResponse<String>> future =
  6.     client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
  7. future.thenApply(HttpResponse::body)
  8.       .thenAccept(System.out::println)
  9.       .join();
复制代码
POST请求提交表单数据

  1. Map<Object, Object> formData = Map.of("username", "test", "password", "secret");
  2. HttpRequest formRequest = HttpRequest.newBuilder()
  3.     .uri(URI.create("https://api.example.com/login"))
  4.     .header("Content-Type", "application/x-www-form-urlencoded")
  5.     .POST(HttpRequest.BodyPublishers.ofString(
  6.         formData.entrySet().stream()
  7.             .map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue().toString(), StandardCharsets.UTF_8))
  8.             .collect(Collectors.joining("&"))))
  9.     .build();
复制代码
高级配置

  1. HttpClient client = HttpClient.newBuilder()
  2.     .version(HttpClient.Version.HTTP_2) // 强制使用HTTP/2
  3.     .connectTimeout(Duration.ofSeconds(10))
  4.     .followRedirects(HttpClient.Redirect.NORMAL)
  5.     .executor(Executors.newVirtualThreadPerTaskExecutor()) // Java 21+虚拟线程
  6.     .build();
复制代码
配置选项包括:


  • HTTP版本选择(HTTP_1_1或HTTP_2)
  • 连接超时设置
  • 重定向计谋(NEVER, ALWAYS, NORMAL)
  • 自定义线程池
  • 代理和认证设置
三、Apache HttpClient详解

虽然Java 11提供了标准HTTP客户端,但Apache HttpClient仍是广泛使用的第三方库,特别是在Java 11之前的项目中。
核心特性



  • 支持HTTP/1.1和HTTPS
  • 连接池管理和多线程支持
  • 多种认证方案(Basic, Digest, NTLM等)
  • Cookie管理
  • 可扩展的API计划
根本使用示例

GET请求

  1. CloseableHttpClient httpClient = HttpClients.createDefault();
  2. HttpGet httpGet = new HttpGet("http://example.com/api");
  3. CloseableHttpResponse response = httpClient.execute(httpGet);
  4. try {
  5.     HttpEntity entity = response.getEntity();
  6.     String result = EntityUtils.toString(entity);
  7.     EntityUtils.consume(entity);
  8. } finally {
  9.     response.close();
  10. }
复制代码
POST请求

  1. CloseableHttpClient httpClient = HttpClients.createDefault();
  2. HttpPost httpPost = new HttpPost("http://example.com/api");
  3. List<NameValuePair> params = new ArrayList<>();
  4. params.add(new BasicNameValuePair("param1", "value1"));
  5. params.add(new BasicNameValuePair("param2", "value2"));
  6. httpPost.setEntity(new UrlEncodedFormEntity(params));
  7. CloseableHttpResponse response = httpClient.execute(httpPost);
  8. // 处理响应同上
复制代码
连接池配置

  1. PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
  2. cm.setMaxTotal(200); // 最大连接数
  3. cm.setDefaultMaxPerRoute(20); // 每个路由最大连接数
  4. CloseableHttpClient httpClient = HttpClients.custom()
  5.     .setConnectionManager(cm)
  6.     .build();
复制代码
四、HttpURLConnection简介

虽然已被取代,但在旧代码中仍大概遇到:
  1. try {
  2.     URL url = new URL("https://example.com");
  3.     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  4.     connection.setRequestMethod("GET");
  5.     if (connection.getResponseCode() == 200) {
  6.         BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  7.         String inputLine;
  8.         while ((inputLine = in.readLine()) != null) {
  9.             System.out.println(inputLine);
  10.         }
  11.     }
  12. } catch (IOException e) {
  13.     e.printStackTrace();
  14. }
复制代码
缺点:


  • 仅支持HTTP/1.1
  • 同步阻塞模型
  • API计划陈旧,使用复杂
  • 缺乏当代特性如连接池
五、各HTTP客户端对比

特性Java 11 HttpClientApache HttpClientHttpURLConnectionHTTP/2支持是否否WebSocket支持是否否同步/异步模型双模型同步同步连接池管理内置支持不支持认证方案根本丰富有限必要额外依靠否是否当代API计划是部门否 六、最佳实践与发起


  • Java 11+项目:优先使用标准HttpClient API,无需额外依靠,功能全面
  • 旧版本Java项目:使用Apache HttpClient而非HttpURLConnection
  • 高性能场景:利用HttpClient的异步特性,配合虚拟线程(Java 21+)提拔吞吐量
  • 微服务情况:考虑团结反应式编程模型使用异步HttpClient
  • 连接管理:公道配置连接池参数,制止资源浪费
  • 错误处理:始终检查响应状态码,妥善处理非常
  • 资源释放:确保关闭响应和客户端实例,防止资源走漏
Java HTTP客户端API的演进反映了Java生态对当代网络编程需求的响应。根据项目需求和Java版本选择符合的HTTP客户端,可以显著提拔开发效率和应用程序性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表