JDK HttpClient - Java 11 可用的 JDK 内置的 HTTP 客户端

在 Java 应用的开发中,发送 HTTP 请求是一个常见的需求。应用在开发时,通常会使用流行的开源第三方库作为 HTTP 客户端,如 Apache HttpClient 或 OkHttp 等。这里介绍的是 JDK 自带的 HttpClient 实现,Java 11 可用。说到这里,还在用 Java 8 的朋友不用着急划走,Java 8 的下一个 LTS 版本就是 Java 11 了,没准什么时候就升级到 Java 11,提前了解一下也没坏处。

JDK 的 HttpClient 在 jdk.net.http 模块中,该模块提供了 HTTP 客户端和 WebSocket 支持。HttpClient 发送 HTTP 请求并对响应进行处理。

HttpClient 的实例通过构建器(HttpClient.Builder)来创建。在创建 HttpClient 时可以进行配置,配置项包括连接超时时间,认证处理器,代理,Cookie处理器,是否跟随跳转,HTTP 协议版本,SSL 配置等。

下图是 HttpClient.Builder 类中包含的方法。

418aca96a83f37133448013f14758e7c.png

从构建器创建出 HttpClient 之后,可以发送 HTTP 请求。HTTP 请求以 HttpRequest 表示。HttpRequest 也通过构建器(HttpRequest.Builder)来创建。在创建时,可以指定 HTTP 请求的URI,方法,HTTP头,超时时间和请求体的内容。

下图是 HttpRequest.Builder 类中包含的方法。

601ad242ec4b5c78f4a1a43e8b58b5f3.png

与 HttpRequest 对应的是表示 HTTP 响应的 HttpResponse。HttpResponse 并不是直接创建的,而是由 BodyHandler 对 HTTP 响应进行处理了之后得到的。在发送请求时,需要提供 BodyHandler 接口的实现来声明对 HTTP 响应的处理方式。在很多时候,并不需要创建自己的 BodyHandler 实现,BodyHandlers 类中提供了很多常用的实现,比如把响应内容转换成 byte[]、String、InputStream,或是把响应内容保存到本地磁盘。

HttpClient 支持同步和异步两种请求发送模式。

  • 同步请求方式使用的是 send 方法,参数是 HttpRequest 和 BodyHandler,返回值是 HttpResponse<T>。

  • 异步请求方式使用的是sendAsync方法,参数同样是 HttpRequest 和 BodyHandler,返回值是 CompletableFuture<HttpResponse<T>>。

下面通过几个具体的例子来说明 JDK HttpClient 的用法。  使用 HttpClient 时,通常按照下面的步骤:

  1. 从 HttpClient 构建器中创建出 HttpClient 对象。

  2. 从 HttpRequest 构建器中创建出 HttpRequest 对象。

  3. 使用 HttpClient 的 send 或 sendAsync 方法发送请求,提供 HttpRequest  和 BodyHandler,并获取表示响应的 HttpResponse。

  4. 从 HttpResponse 中获取 HTTP 响应。

  5. 对响应内容进行处理。

第一个例子是同步方式发送 GET 请求。使用的是 BodyHandlers 中的 ofString 方法,把响应转换成 String。

public class SyncGet {void run() throws IOException, InterruptedException {HttpClient httpClient = HttpClient.newBuilder().followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofMinutes(1)).version(Version.HTTP_1_1).build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://www.baidu.com")).GET().build();HttpResponse<String> response = httpClient.send(request,BodyHandlers.ofString());System.out.println(response.body());}public static void main(String[] args)throws IOException, InterruptedException {new SyncGet().run();}
}

第二个例子是同步方式发送 POST 请求。请求的内容以 BodyPublisher 表示,BodyPublishers 中包含了常用的 BodyPublisher 实现,ofString 方法从 String 中创建出 BodyPublisher。

public class SyncPost {void run() throws IOException, InterruptedException {HttpClient httpClient = HttpClient.newBuilder().followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofMinutes(1)).version(Version.HTTP_1_1).build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://httpbin.org/post")).POST(BodyPublishers.ofString("{\"name\": \"Alex\"}")).build();HttpResponse<String> response = httpClient.send(request,BodyHandlers.ofString());System.out.println(response.body());}public static void main(String[] args)throws IOException, InterruptedException {new SyncPost().run();}
}

第三个例子是异步方式发送 GET 请求,并把响应保存在本地磁盘。使用的是 BodyHandlers 的 ofFile 方法,把响应保存在指定的文件中。因为 sendAsync 方法的返回值是 CompletableFuture,调用 get 方法等待请求完成并获取响应。

public class AsyncSaveToFile {void run() throws ExecutionException, InterruptedException, IOException {HttpClient httpClient = HttpClient.newBuilder().followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofMinutes(1)).version(Version.HTTP_1_1).build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://www.baidu.com")).GET().build();Path savedFile = Files.createTempFile("jdk-http-client-", ".html");HttpResponse<Path> response = httpClient.sendAsync(request,BodyHandlers.ofFile(savedFile)).get();System.out.println("Response saved to " + response.body());}public static void main(String[] args)throws ExecutionException, InterruptedException, IOException {new AsyncSaveToFile().run();}
}

介绍了 JDK 的 HttpClient 之后,最后的一个问题是,什么时候应该使用 JDK HttpClient。JDK 的 HttpClient 最大的优势是开箱即用,并不需要外部依赖,JDK 11 支持了直接以 java 命令运行 Java 源文件,可以用 Java 写脚本。如果需要临时发送 HTTP请求并对响应进行处理,可以写一个 Java 源文件,其中直接使用 JDK HttpClient,再用 java 直接运行即可。使用 JDK HttpClient 可以避免引入外部依赖,减少了应用的部署尺寸和运行时的消耗。

最后展示一个使用 JDK HttpClient 作为脚本的例子,这个脚本的作用是获取百度热搜上的新闻标题。使用 HttpClient 获取到网页的内容,再用正则表达式进行解析。该脚本可以用 java 命令直接运行,输出结果。

该脚本的代码如下所示。

public class ExtractBaiduHotSearchWords {List<String> extract() throws IOException, InterruptedException {HttpClient httpClient = HttpClient.newBuilder().followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofMinutes(1)).version(Version.HTTP_1_1).build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://top.baidu.com/board")).GET().build();HttpResponse<String> response = httpClient.send(request,BodyHandlers.ofString());Pattern pattern = Pattern.compile("\"word\":\"(.*?)\"",Pattern.MULTILINE);Matcher matcher = pattern.matcher(response.body());List<String> result = new ArrayList<>();int count = 0;while (matcher.find() && count < 10) {result.add(matcher.group(1));count++;}return result;}public static void main(String[] args)throws IOException, InterruptedException {new ExtractBaiduHotSearchWords().extract().forEach(System.out::println);}
}

运行效果如下图所示。这里直接使用 java 命令运行源文件。

28b1c8312879799e578d6083c7b8b4e0.png

完整的示例代码见 GitHub (alexcheng1982/jdk-http-client-example)。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

物联网主机 E6000:智慧应急领域的创新力量

在当今瞬息万变的世界中&#xff0c;突发事件和紧急情况时有发生。如何迅速、准确地应对这些挑战&#xff0c;保障人民生命财产安全&#xff0c;成为了社会发展的重要课题。而物联网主机 E6000 的出现&#xff0c;为智慧应急领域带来了全新的解决方案。 一、强大的性能与功能 物…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

ROS话题发布与订阅

续上一篇文章。 我们现在在VScode里面加入订阅方的实现。 demo02_sub.cpp #include "ros/ros.h" #include "std_msgs/String.h"/*订阅方实现&#xff1a;1、包含头文件ROS中文本类型 ---> std_msgs/String.h2、初始化ROS节点3、创建节点句柄4、创建订…

中国篆刻艺术孙溟㠭作品《活着》

活着只是一吸一呼之间&#xff0c;在意觉醒之间&#xff0c;在血液流动之间&#xff0c;抛却灵与肉生死&#xff0c;一切都是惘然。妻吴晓蕾题款&#xff0c;甲辰夏月溟㠭于寒舍小窗下刊石。

力扣高频SQL 50题(基础版)第七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题1068. 产品销售分析 I题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图:总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题 1068. 产品销售分析 I 题目说明 …

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘

1,下载 RTL8125B driver 下载页&#xff1a; https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页&#xff1a; https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压&#xff1a; $ tar xj…

【案例】使用React+redux实现一个Todomvc

About 大家好&#xff0c;我是且陶陶&#xff0c;今天跟大家分享一个redux的todoList案例&#xff0c;通过这个案例能够快速掌握redux的基本知识点&#x1f339; ❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…

Helm部署k8s应用

文章目录 一、概述1、什么是Helm2、特点3、工作流程4、核心概念 二、安装Helm1、二进制版本安装1.1、下载需要的版本1.2、解压1.3、将helm移动到指定路径1.4、验证 三、Helm安装资源顺序四、--set 的格式和限制1、最简单的name/value对2、多个name/value对3、更复杂的表达式4、…

Java语言程序设计基础篇_编程练习题*15.3 (移动小球)

*15.3 (移动小球) 编写一个程序&#xff0c;在面板上移动小球。应该定义一个面板类来显示小球&#xff0c;并提供向左、 向右 、向上和向下移动小球的方法&#xff0c;如图15-24c所示。请进行边界检査以防止球完全移到视线之外 代码展示&#xff1a;编程练习题15_3MoveBall.ja…

鸿蒙OpenHarmony Native API【drawing_pen.h】 头文件

drawing_pen.h Overview Related Modules: [Drawing] Description: 文件中定义了与画笔相关的功能函数 Since: 8 Version: 1.0 Summary Enumerations Enumeration NameDescription[OH_Drawing_PenLineCapStyle] { [LINE_FLAT_CAP], [LINE_SQUARE_CAP], [LINE_ROUND_…

Redis核心技术与实战学习笔记

Redis核心技术与实战学习笔记 最近想沉下心来看下redis&#xff0c;买了蒋德钧老师的《Redis 核心技术与实战》,这里记录一些学习笔记 希望能够坚持下去有想一起学习的童鞋&#xff0c;可以点击跳转到文章尾部获取学习资源,仅供学习不要用于任何商业用途!!! redis知识全景图 …

ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案

0 前言 室内机器人需要具备适应性和灵活性&#xff0c;以便在狭窄的空间中进行安全、高效的导航。本文提供一些让机器人在狭窄区域安全通过的思路&#xff0c;希望帮助读者根据实际开发适当调整和扩展 1 Voronoi图 Voronoi图&#xff1a;根据给定的一组“种子点”&#xff0…

Ubuntu22.04系统安装nodejs 14 保姆级教程

下载软件包 从NodeSource 的官方源下载并安装 Node.js 14.x 版本的软件包&#xff0c;适用于 Debian 和 Ubuntu 系统&#xff1a; curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - 更新软件源 更新软件源 sudo apt-get update 下载bodejs14 下载nodejs14 sud…

Jenkins卡在等待界面解决方法

一、问题 部署jenkins服务器出现Please wait while Jenkins is getting ready to work。 二、原因分析 jenkins里面文件指向国外的官网&#xff0c;因为防火墙的原因连不上。 三、解决方法 将配置文件里面的url换成国内镜像&#xff1a; &#xff08;1&#xff09;修改配…

WEB攻防-通用漏洞-SQL 读写注入-MYSQLMSSQLPostgreSQL

什么是高权限注入 高权限注入指的是攻击者通过SQL注入漏洞&#xff0c;利用具有高级权限的数据库账户&#xff08;如MYSQL的root用户、MSSQL的sa用户、PostgreSQL的dba用户&#xff09;执行恶意SQL语句。这些高级权限账户能够访问和修改数据库中的所有数据&#xff0c;甚至执行…

2024/7/23 英语每日一段

As malware has improved and evolved, it has pushed defense software to require constant connection and more extensive control. That deeper access also introduces a far higher possibility that security software—and updates to that software—will crash the …

RabbitMQ入门详解

前言 本篇文章将详细介绍rabbitmq的基本概念知识&#xff0c;以及rabbitmq各个工作模式在springboot中如何使用。 文章目录 介绍 简介 RabbitMQ 核心 生产者与消费者 Exchange Queue 工作模式 简单模式 工作队列模式 发布订阅模式 路由模式 主题模式 SpringBoot中…

java算法day21

java算法day21 77 组合216 组合总和Ⅲ17 电话号码的数字组合39 组合总和 这个阶段所要解决的问题都是有关回溯算法。 所以说解法基本上都是围绕回溯算法模板来完成。回溯算法可以这样总结&#xff0c;树形结构&#xff0c;横向遍历&#xff0c;纵向递归。递归出口收货结果并终…

(十九)原生js案例之h5地里位置信息与高德地图的初使用

h5 地里位置信息 1. 获取当前位置信息 window.onload function () {const oBtn document.querySelector("#btn");const oBox document.querySelector("#box");oBtn.onclick function () {window.navigator.geolocation.getCurrentPosition(function (…

c++----模版进阶

c----模版初阶&#xff1a;http://t.csdnimg.cn/PiYoD 一.非类型模版参数 模板参数除了可以是类型&#xff0c;还可以是常量。 例如&#xff1a; 这样就可以在类中使用这个n常量。 -------------------------------------------------------------------------------------…