当前位置: 首页 > news >正文

java.net.http 包详解

java.net.http 包是 Java 11 引入的 HTTP 客户端 API,提供了现代、灵活且功能强大的 HTTP 客户端功能,替代了传统的 HttpURLConnection


核心类

1. HttpClient

HTTP 客户端的主要入口点,用于发送请求和接收响应。

主要特性:

  • 支持 HTTP/1.1 和 HTTP/2

  • 同步和异步请求

  • WebSocket 支持

  • 连接池管理

  • 重定向处理

  • 认证支持

创建 HttpClient 示例:

HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2)  // 使用HTTP/2.followRedirects(HttpClient.Redirect.NORMAL)  // 跟随重定向.connectTimeout(Duration.ofSeconds(20))  // 连接超时.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))  // 代理.authenticator(Authenticator.getDefault())  // 认证.build();

2. HttpRequest

表示要发送的 HTTP 请求。

构建请求示例:

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/api")).header("Content-Type", "application/json").timeout(Duration.ofMinutes(2)).POST(HttpRequest.BodyPublishers.ofString("{\"key\":\"value\"}")).build();

BodyPublishers 类型:

  • ofString() - 从字符串创建请求体

  • ofByteArray() - 从字节数组创建请求体

  • ofFile() - 从文件创建请求体

  • noBody() - 无请求体


3. HttpResponse

表示接收到的 HTTP 响应。

处理响应体:

  • body() - 获取响应体

  • BodyHandlers 用于处理响应体:

    • ofString() - 将响应体作为字符串

    • ofByteArray() - 将响应体作为字节数组

    • ofFile() - 将响应体写入文件

    • discarding() - 丢弃响应体

同步请求示例

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());

异步请求示例

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join(); // 等待完成

WebSocket 支持

HttpClient client = HttpClient.newHttpClient();WebSocket webSocket = client.newWebSocketBuilder().buildAsync(URI.create("ws://example.com/chat"), new WebSocket.Listener() {@Overridepublic void onOpen(WebSocket webSocket) {System.out.println("WebSocket opened");webSocket.sendText("Hello", true);WebSocket.Listener.super.onOpen(webSocket);}@Overridepublic CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {System.out.println("Received message: " + data);return WebSocket.Listener.super.onText(webSocket, data, last);}}).join();

高级特性

1. 多部分请求

String boundary = "boundary";
HttpRequest request = HttpRequest.newBuilder().header("Content-Type", "multipart/form-data; boundary=" + boundary).POST(HttpRequest.BodyPublishers.ofByteArrays(Arrays.asList("--boundary\r\nContent-Disposition: form-data; name=\"field1\"\r\n\r\nvalue1\r\n".getBytes(),"--boundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.txt\"\r\nContent-Type: text/plain\r\n\r\nFile content\r\n".getBytes(),"--boundary--\r\n".getBytes()))).build();

2. 处理响应流

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/large-file")).build();HttpResponse<InputStream> response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());try (InputStream is = response.body()) {// 处理输入流byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {// 处理数据块}
}

3. 请求拦截器

HttpClient client = HttpClient.newBuilder().executor(Executors.newFixedThreadPool(5)).authenticator(new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("user", "password".toCharArray());}}).build();

最佳实践

  1. 重用 HttpClient:HttpClient 是线程安全的,应该重用而不是为每个请求创建新实例

  2. 处理超时:总是设置合理的连接和请求超时

  3. 错误处理:正确处理 HTTP 错误状态码和异常

  4. 资源管理:确保关闭响应体和输入流

  5. 性能考虑:对于大量请求,考虑使用异步模式

java.net.http 包提供了现代 HTTP 客户端所需的所有功能,是 Java 应用程序中进行 HTTP 通信的首选方式。

http://www.dtcms.com/a/601776.html

相关文章:

  • K8s Service核心功能:稳定访问与负载均衡
  • 有向图的可达性分析
  • 网站开发西安网页设计基础项目考核
  • INT305 Machine Learning 机器学习 Pt.8 Bagging 和 Boosting
  • React+Ant design
  • C++四种类型转换cast,其在参数传递时的作用
  • 什么网站可以做图赚钱网站建设主体设计要求
  • 云手机的核心价值
  • L10_参数验证
  • 免费网站制作手机软件的appaso排名优化
  • Java是编译型语言吗?解析Java语言的编译与执行过程
  • Hugging face微调 GPT-2模型
  • 1.3 半监督学习黑科技:如何用少量标注数据提升模型性能,节省90%标注成本?
  • 声学超材料与AI驱动的声振仿真优化设计
  • 罗湖建设公司网站建设企业推广app
  • 2025最新版Python 3.14.0安装使用指南
  • Keil5创建新工程时找不到STM32芯片
  • 重庆企业免费建站网站开发前台后台怎么交互
  • html5可以做交互网站吗西安模板建站公司
  • PostgreSQL 可视化监控利器 —— pg_top 安装与使用全攻略(查看正在执行的SQL占用的资源)
  • C语言 | 文件操作详解与实战示例
  • Spring ThreadPoolTaskExecutor 与 CompletableFuture.supplyAsync 常用实践
  • 网站太卡怎么优化wordpress meta key
  • 现在入局自助KTV,算晚吗?
  • 用Microsoft Visual Studio Installer Projects 2022打包程序,同时安装VC++的运行库等
  • 南宁网站制作建设建设网站需要哪些语言
  • C语言在线编译工具 | 提升编程效率与学习体验
  • ARM《10》_03_字符设备驱动进阶(并发→竞态→同步机制、阻塞io和非阻塞io)
  • 【DaisyUI]】dropdown在点击菜单项之后不关闭,怎么破?
  • 常德公司做网站手机网站怎么做的好