☕️从小工到专家的 Java 进阶之旅:全新的HttpClient,现代高效的网络通信利器

☕️从小工到专家的 Java 进阶之旅:全新的HttpClient,现代高效的网络通信利器

你好,我是看山。

本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏。日拱一卒,功不唐捐。

在 Java 开发领域,网络通信一直是至关重要的部分。从早期的网络编程方式到如今,Java 在 HTTP 客户端方面经历了不断的演进。

其中,Java11 中正式推出的全新 HttpClient 带来了许多令人瞩目的变化。

一、Java HttpClient 的演进历程

在 Java 的发展历程中,HttpURLConnection 是早期进行 HTTP 通信的主要方式之一。然而,随着网络应用的日益复杂和对性能、功能的更高要求,它逐渐暴露出一些局限性。

传统的 HttpURLConnection 在处理复杂的网络交互场景时,代码编写相对繁琐,缺乏一些现代网络编程所需要的特性。例如,在异步处理、高效的并发操作以及对新的 HTTP 协议版本的支持方面表现不够理想。

而全新的 HttpClient 则应运而生,它是 Java 为了满足现代网络应用开发需求而设计的新一代 HTTP 客户端库。它的出现标志着 Java 在网络通信领域迈向了一个新的阶段,为开发者提供了更强大、更高效、更灵活的网络编程工具。

二、新 HttpClient 的特点与优势

(一)强大的功能特性

  1. 支持多种协议版本

    • 新的 HttpClient 同时支持 HTTP/1.1 和 HTTP/2。HTTP/2 相比 HTTP/1.1 在性能上有显著的提升,它通过多路复用、头部压缩等技术,减少了网络延迟,提高了数据传输效率。
    • 对于安全的网络通信,它也很好地支持了 HTTPS/TLS 协议,确保数据在传输过程中的安全性和完整性。
  2. 异步发送与通知机制

    • 支持异步操作是新 HttpClient 的一个重要特性。通过异步发送请求,应用程序可以在等待服务器响应的同时执行其他任务,提高了程序的并发处理能力。
    • 当异步请求完成时,客户端可以通过通知机制及时获取响应结果,这种机制使得程序的响应性更加出色。
  3. WebSocket 支持

    • WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。新 HttpClient 对 WebSocket 的支持使得 Java 应用程序能够轻松地构建实时的、双向通信的网络应用,如即时通讯、实时数据推送等。
  4. 响应式流

    • 响应式流是一种处理异步数据流的编程模型。新 HttpClient 与响应式流的集成,使得开发者可以更加高效地处理大量的异步数据,比如在处理实时数据更新或者大数据流传输的场景下,能够实现更平滑的数据处理和更低的资源消耗。

(二)简洁易用的 API

  1. 链式调用和流式操作

    • 新 HttpClient 的 API 设计非常简洁,它大量采用了链式调用和流式操作的方式。例如,在构建请求时,可以通过链式调用连续地设置请求方法、请求头、请求体等信息,使得代码更加清晰、简洁,易于理解和维护。
    • 这种设计模式符合现代编程的习惯,提高了开发效率。
  2. 与现有网络 API 一致的安全检查

    • 在安全方面,新 HttpClient 与 Java 现有的网络安全 API 保持了一致。它继承了 Java 安全模型的优势,在进行网络请求时,能够自动进行必要的安全检查,如证书验证、权限检查等,确保网络通信的安全可靠。

(三)高效的性能表现

  1. NIO 模型

    • 新 HttpClient 基于 NIO(Non - Blocking I/O)模型进行设计。NIO 模型能够在一个线程中处理多个连接,避免了传统阻塞 I/O 模型中线程被阻塞等待 I/O 操作完成的情况。
    • 这使得新 HttpClient 在高并发场景下能够高效地利用系统资源,大大提高了程序的吞吐量和响应速度。
  2. 函数式编程

    • 函数式编程的思想在新 HttpClient 中得到了充分的体现。通过使用函数式接口和 Lambda 表达式,开发者可以更加简洁地定义请求处理逻辑、响应处理逻辑等,减少了代码的冗余和复杂性。
  3. CompletableFuture 异步回调

    • CompletableFuture 是 Java 8 引入的一个用于异步编程的类。新 HttpClient 利用 CompletableFuture 实现异步回调机制,使得开发者可以方便地在异步操作完成后执行后续的处理逻辑。
    • 这种异步回调机制能够有效地避免阻塞,提高程序的并发性能。

三、新 HttpClient 的使用方法

(一)同步请求

以下是一个简单的同步请求的示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientSyncExample {public static void main(String[] args) throws Exception {// 创建 HttpClient 对象HttpClient httpClient = HttpClient.newHttpClient();// 构建 HttpRequestHttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com")).GET().build();// 发送请求并获取 HttpResponseHttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());System.out.println("Response status code: " + httpResponse.statusCode());System.out.println("Response body: " + httpResponse.body());}
}

在上述示例中,首先通过HttpClient.newHttpClient()创建了一个 HttpClient 对象。然后使用HttpRequest.newBuilder()构建了一个 GET 请求,并指定了请求的 URL。最后通过httpClient.send()方法发送请求并获取响应。

(二)异步请求

异步请求的示例如下:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;public class HttpClientAsyncExample {public static void main(String[] args) throws Exception {// 创建 HttpClient 对象HttpClient httpClient = HttpClient.newHttpClient();// 构建 HttpRequestHttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com")).GET().build();// 发起异步请求并处理结果CompletableFuture<HttpResponse<String>> futureResponse = httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString());futureResponse.thenApply(response -> {System.out.println("Response status code: " + response.statusCode());System.out.println("Response body: " + response.body());return response;}).exceptionally(ex -> {System.out.println("Error occurred: " + ex.getMessage());return null;});// 主线程可以继续执行其他任务System.out.println("Main thread is doing other things...");// 等待异步操作完成futureResponse.join();}
}

在这个示例中,通过httpClient.sendAsync()方法发起异步请求,返回一个CompletableFuture对象。然后通过thenApply()方法在请求成功完成时处理响应,通过exceptionally()方法处理异常情况。

(三)发送 POST 请求

发送 POST 请求时,通常需要设置请求体。以下是一个示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;import java.nio.charset.StandardCharsets;public class HttpClientPostExample {public static void main(String[] args) throws Exception {HttpClient httpClient = HttpClient.newHttpClient();String requestBody = "data to be sent in the POST request";HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com/api")).POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8)).header("Content-Type", "application/json").build();HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());System.out.println("Response status code: " + httpResponse.statusCode());System.out.println("Response body: " + httpResponse.body());}
}

在这个示例中,使用HttpRequest.BodyPublishers.ofString()方法设置了请求体,并指定了字符编码。同时,还设置了请求头中的Content - Typeapplication/json

(四)处理响应体

除了使用HttpResponse.BodyHandlers.ofString()来获取字符串形式的响应体,还可以使用其他的响应体处理器。例如,HttpResponse.BodyHandlers.ofByteArray()可以获取字节数组形式的响应体,HttpResponse.BodyHandlers.ofInputStream()可以获取输入流形式的响应体。

以下是一个使用HttpResponse.BodyHandlers.ofByteArray()的示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientResponseBodyExample {public static void main(String[] args) throws Exception {HttpClient httpClient = HttpClient.newHttpClient();HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com/image.jpg")).GET().build();HttpResponse<byte[]> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofByteArray());byte[] responseBody = httpResponse.body();// 可以对字节数组形式的响应体进行进一步处理,比如保存为文件等}
}

(五)设置超时和重定向策略

可以自定义 HttpClient 的配置来设置超时时间和重定向策略。

设置超时时间的示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;import java.time.Duration;public class HttpClientTimeoutExample {public static void main(String[] args) throws Exception {HttpClient httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com")).GET().build();HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());System.out.println("Response status code: " + httpResponse.statusCode());System.out.println("Response body: " + httpResponse.body());}
}

在这个示例中,通过HttpClient.newBuilder().connectTimeout()方法设置了连接超时时间为 5 秒。

设置重定向策略的示例:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;import java.net.http.HttpClient.Redirect;public class HttpClientRedirectExample {public static void main(String[] args) throws Exception {HttpClient httpClient = HttpClient.newBuilder().followRedirects(Redirect.NEVER).build();HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create("http://example.com/redirect")).GET().build();HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());System.out.println("Response status code: " + httpResponse.statusCode());System.out.println("Response body: " + httpResponse.body());}
}

在这个示例中,通过HttpClient.newBuilder().followRedirects()方法设置了重定向策略为从不重定向。

四、新 HttpClient 的未来展望

新 HttpClient 在 Java 网络通信中已经占据了重要的地位。随着 Java 技术的不断发展以及网络应用场景的不断拓展,它未来的发展方向和应用前景值得期待。

在未来,新 HttpClient 可能会进一步优化性能,尤其是在高并发、大数据量传输等极端场景下。它可能会与 Java 的其他新特性,如虚拟线程等进行更好的结合,以提供更加高效、稳定的网络通信能力。

在应用领域方面,新 HttpClient 将在微服务架构、分布式系统、物联网等领域发挥更大的作用。例如,在微服务架构中,服务之间的高效通信是关键,新 HttpClient 可以为服务间的 HTTP 调用提供更好的性能和可靠性。在物联网领域,大量的设备需要与服务器进行网络通信,新 HttpClient 可以满足物联网设备对高效、低资源消耗的网络通信的需求。

总之,Java 全新 HttpClient 是一个强大、高效、灵活的网络通信工具,它为 Java 开发者在现代网络应用开发中提供了有力的支持。随着它的不断发展和完善,相信它将在更多的领域得到广泛的应用。

文末总结

本文介绍了Java11提供的新版HttpClient的功能,在后续的开发过程中,我们就有了更多的选择。

青山不改,绿水长流,我们下次见。

推荐阅读

  • 从小工到专家的 Java 进阶之旅
  • 一文掌握 Java8 Stream 中 Collectors 的 24 个操作
  • 一文掌握 Java8 的 Optional 的 6 种操作
  • 使用 Lambda 表达式实现超强的排序功能
  • Java8 的时间库(1):介绍 Java8 中的时间类及常用 API
  • Java8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换
  • Java8 的时间库(3):开始使用 Java8 中的时间类
  • Java8 的时间库(4):检查日期字符串是否合法
  • Java11 中基于嵌套关系的访问控制优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444698.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】函数栈帧的创建和销毁

文章目录 前言函数栈帧相关寄存器相关汇编指令内存函数栈帧的创建销毁过程 前言 为了更好的了解函数里面变量是如何创建&#xff0c;为什么创建的变量是随机值和函数怎么传参和顺序是怎样的、以及实参和形参的关系&#xff0c;还要函数之间的调用、返回和销毁的过程。我们今天…

Comfyui 学习笔记5

1.图像处理小工具&#xff0c;沿某个轴反转Image Flip 2. reactor换脸 3. 通过某人的多张照片进行训练 训练的模型会保存在 models/reactor/face/下面&#xff0c;使用时直接load就好 4. 为一个mask 更加模糊 羽化 5. 指定位置替换&#xff0c;个人感觉这种方式进行换脸的融…

Pura 70系列和Pocket 2已支持升级尝鲜鸿蒙NEXT,报名教程在这里

相信不少关注鸿蒙 NEXT 的人都知道&#xff0c;10月8日起&#xff0c;华为开启了鸿蒙 NEXT 系统的公测&#xff0c;但有不少人不知道的是&#xff0c;除了公测的 Mate 60 和 Mate X5 两个系列的机型&#xff0c;还有两个系列的手机其实也可以提前升级体验鸿蒙 NEXT 系统。 Pur…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

统一流程引擎如何具体实现对多系统业务流程的整合?

在信息化时代&#xff0c;企业和组织通常会使用多个业务系统来满足不同的业务需求。然而&#xff0c;这些分散的业务系统往往会导致业务流程的碎片化&#xff0c;降低工作效率。统一流程引擎的出现为解决这一问题提供了有效的途径。它能够整合多系统的业务流程&#xff0c;实现…

LeetCode 3310. 移除可疑的方法

LeetCode 3310. 移除可疑的方法 你正在维护一个项目&#xff0c;该项目有 n 个方法&#xff0c;编号从 0 到 n - 1。 给你两个整数 n 和 k&#xff0c;以及一个二维整数数组 invocations&#xff0c;其中 invocations[i] [ai, bi] 表示方法 ai 调用了方法 bi。 已知如果方法 k…

云栖实录 | MaxCompute 迈向下一代的智能云数仓

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 张治国 | 阿里云智能集团研究员、阿里云 MaxCompute 负责人 谢德军&#xff5c;阿里云智能集团资深技术专家 于得水&#xff5c;阿里云智能集团资深技术专家 谌鹏飞&#xff5c…

List子接口

1.特点&#xff1a;有序&#xff0c;有下标&#xff0c;元素可以重复 2.方法&#xff1a;包含Collection中的所有方法&#xff0c;还包括自己的独有的方法&#xff08;API中查找&#xff09; 还有ListIterator&#xff08;迭代器&#xff09;&#xff0c;功能更强大。 包含更多…

Basic Pentesting_ 2靶机渗透

项目地址 plain https://download.vulnhub.com/basicpentesting/basic_pentesting_2.tar.gz 修改静态ip 开机按e 输入rw signie init/bin/bash ctrlx 进入编辑这个文件 vi /etc/network/interfaces修改网卡为ens33 保存退出 实验过程 开启靶机虚拟机 ![](https://img-bl…

C++ -内存管理

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C -内存管理 C/C -内存管理的深入探讨1. 数据存储分类1.1 局部数据1.2 静态数据1.3 常量数据1.4 动态申请的数据 2. 内存区域划分2.1 栈区2.2 堆区2.3 静态区/数据段2.4 常量区…

HTML5--裸体回顾

免责声明&#xff1a;本文仅做分享~ 详情请参考以下&#xff1a; HTML 系列教程 (w3school.com.cn) 菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; --本文是光秃秃的空壳. 标题标签 段落标签 换行和水平线 文本格式化标签 &#xff08;一般用左边的&#xff…

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它能创建一系列相关的对象&#xff0c;而无需指定其具体类&#xff0c;另一种说法是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。它提供了一种创建对象的最…

如何让信息学奥赛学习“边玩边学”?——趣味编程让枯燥学习变得有趣

信息学奥赛&#xff08;NOI&#xff09;作为一项高水平的编程竞赛&#xff0c;内容涉及到大量的算法、数据结构和复杂的逻辑思维&#xff0c;对学生的要求非常高。然而&#xff0c;面对枯燥的知识点和高难度的题目&#xff0c;很多学生在备赛过程中容易感到乏味甚至放弃。那么&…

YOLO11改进|SPPF篇|引入SPPFCSPC金字塔结构

目录 一、【SPPFCSPC】金字塔结构1.1【SPPFCSPC】金字塔结构介绍1.2【SPPFCSPC】核心代码 二、添加【SPPFCSPC】金字塔结构2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPFCSPC】金字塔结构 1.1【SPPFCSPC】金字塔结构介绍 下图是…

重学SpringBoot3-集成Redis(一)之基础功能

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;一&#xff09;之基础功能 1. 项目初始化2. 配置 Redis3. 配置 Redis 序列化4. 操作 Redis 工具类5. 编写 REST 控制器6. 测试 AP…

思维训练(数论 + 哈希表 + 贪心)

传送门:Dashboard - Codeforces Round 950 (Div. 3) - Codeforces B. Choosing Cubes(排序) Dmitry has n cubes, numbered from left to right from 1 to n. The cube with index f is his favorite. Dmitry threw all the cubes on the table, and the i-th cube showed t…

【HarmonyOS】HMRouter使用详解(四)路由拦截

路由拦截器 可以对指定或全局路由跳转时添加拦截器&#xff0c;作用是可以实现在页面切换前做判断是否有进入当前页面的权限。这篇文章将实现登录的全局路由拦截样式。 新建拦截器类 通过继承IHMInterceptor接口实现生命周期接口的方法重写。 通过添加HMInterceptor装饰器&…

xss之dom类型

目录 xss关于dom类型 1、闭合方式 2、闭合&#xff0c;直接输入1&#xff0c;成功闭合 上我们的pikachu xss关于dom类型 1、闭合方式 输入123&#xff0c;然后打开f12&#xff0c;审查元素&#xff0c;之前一直没有搞懂为什么要在前面加上个单引号 输入两个双引号&#x…

[C语言] 函数详解:库函数与自定义函数

文章目录 函数的概念库函数和自定义函数库函数使用库函数示例常用库函数及头文件 自定义函数自定义函数的基本结构示例&#xff1a;实现两个数的求和函数自定义函数的好处 函数的返回值有返回值的函数无返回值的函数 函数的声明与调用声明函数在另一个文件中调用函数示例&#…

【永磁同步电机(PMSM)】 9. 滑模观测器(SMO)的算法与仿真

【永磁同步电机&#xff08;PMSM&#xff09;】 滑模观测器&#xff08;SMO&#xff09;的算法与仿真 1. 滑模观测器的基本原理2. 滑模观测器的数学模型2.1 PMSM 的数学模型2.2 滑模观测器的设计 3. 基于反正切&#xff08;ATAN&#xff09;的滑模观测器3.1 反正切函数3.2 基于…