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

JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南

1、简述

CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互,可以发送 GET、POST 等各种请求类型,并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。

在这里插入图片描述

2、特性

CloseableHttpClient 是 HttpClient 的一个实现类,它可以进行各种 HTTP 请求,并且在使用完毕时支持关闭以释放资源。与其搭配的 HttpResponse 提供了对 HTTP 响应的解析。

主要特性包括:

  • 支持同步和异步请求
  • 支持连接池和重试机制
  • 支持多种请求方法:GET、POST、PUT、DELETE 等
  • 支持表单数据、JSON 数据和文件上传等多种数据格式

3、基础用法

3.1 发送 GET 请求

GET 请求用于从服务器获取资源数据,示例如下:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientExample {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建GET请求HttpGet request = new HttpGet("http://httpbin.org/get");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 获取响应体HttpEntity entity = response.getEntity();if (entity != null) {// 将响应体转为字符串String result = EntityUtils.toString(entity);System.out.println(result);}}} catch (IOException e) {e.printStackTrace();}}
}
3.2 发送 POST 请求

POST 请求用于向服务器提交数据,例如表单数据或 JSON 数据:


import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientExample {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建GET请求HttpGet request = new HttpGet("http://httpbin.org/get");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 获取响应体HttpEntity entity = response.getEntity();if (entity != null) {// 将响应体转为字符串String result = EntityUtils.toString(entity);System.out.println(result);}}} catch (IOException e) {e.printStackTrace();}}
}
3.3 表单数据和文件上传

在实际开发中,通常会遇到需要上传文件的场景。例如,用户通过网页上传文件到服务器,这时就需要使用 MultipartEntityBuilder 来构建多部分表单(form-data)。

上传文件和表单参数 通过 MultipartEntityBuilder 可以轻松实现文件上传和传递其他表单字段:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.File;
import java.io.IOException;
import java.util.Map;public class HttpClientFileUploadWithParams {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建POST请求HttpPost postRequest = new HttpPost("http://httpbin.org/post");// 模拟表单参数 (key-value 对)Map<String, String> formParams = Map.of("username", "john_doe","password", "secret_password");// 构建MultipartEntity,添加文件参数和普通表单参数MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.addBinaryBody("file", new File("path/to/your/file.txt"),ContentType.APPLICATION_OCTET_STREAM, "file.txt");// 添加表单参数for (Map.Entry<String, String> entry : formParams.entrySet()) {builder.addTextBody(entry.getKey(), entry.getValue(), ContentType.TEXT_PLAIN);}// 设置请求体HttpEntity multipart = builder.build();postRequest.setEntity(multipart);// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(postRequest)) {// 获取响应体String result = EntityUtils.toString(response.getEntity());System.out.println(result);}} catch (IOException e) {e.printStackTrace();}}
}
3.4 使用 Map 传递 JSON 数据

如果需要发送 POST 请求并将数据以 JSON 格式发送,可以使用 Map 构建数据并将其序列化为 JSON 格式:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class HttpClientMapJsonExample {public static void main(String[] args) throws IOException {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建POST请求HttpPost postRequest = new HttpPost("http://httpbin.org/post");// 模拟参数 (key-value 对)Map<String, Object> jsonParams = new HashMap<>();jsonParams.put("username", "john_doe");jsonParams.put("age", 30);jsonParams.put("active", true);// 将Map转换为JSON字符串ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(jsonParams);// 设置请求体 (JSON格式)StringEntity entity = new StringEntity(json);postRequest.setEntity(entity);postRequest.setHeader("Content-Type", "application/json");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(postRequest)) {// 获取响应体String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}}
}

4、错误处理和性能优化

4.1错误处理

在使用 CloseableHttpClient 时,建议对 HTTP 请求的响应状态码进行检查,确保服务器返回了预期的结果:

int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {// 成功处理逻辑
} else {System.err.println("请求失败,状态码:" + statusCode);
}
4.2 连接池和超时设置

为了提高性能,可以使用连接池管理多个 HTTP 连接。此外,设置合理的超时时间对于处理网络延迟也是必要的:

import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.util.Timeout;public class HttpClientPoolExample {public static CloseableHttpClient createHttpClientWithPool() {// 创建连接池管理器,并设置最大连接数和每个路由的最大连接数PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100); // 最大连接数connectionManager.setDefaultMaxPerRoute(20); // 每个路由的最大连接数// 配置请求的超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(Timeout.ofSeconds(10))        // 连接超时时间.setConnectionRequestTimeout(Timeout.ofSeconds(5)) // 从连接池获取连接的超时时间.setResponseTimeout(Timeout.ofSeconds(15))        // 请求超时时间.build();// 创建带有连接池和请求配置的 HttpClientreturn HttpClients.custom().setConnectionManager(connectionManager) // 设置连接池管理器.setDefaultRequestConfig(requestConfig)  // 设置请求配置.build();}
}

5、总结

通过使用 CloseableHttpClient,可以方便地在 Java 中实现各种 HTTP 请求,包括 GET、POST、文件上传等。在实际开发中,我们可以根据具体业务场景灵活调整请求配置,例如设置超时、使用连接池管理多线程请求等。

这种 HTTP 客户端非常适合 REST API 调用、文件处理等常见应用场景。

相关文章:

JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南

1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互&#xff0c;可以发送 GET、POST 等各种请求类型&#xff0c;并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...

Mac上搭建k8s环境——Minikube

1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…...

经典排序算法复习----C语言

经典排序算法复习 分类 交换类 冒泡快排 分配类 计数排序基数排序 选择类 选择排序 堆排序 归并类 归并排序 插入类 直接插入排序 希尔排序 折半插入排序 冒泡排序 基于交换。每一轮找最大值放到数组尾部 //冒泡排序 void bubSort(int* arr,int size){bool sorte…...

自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同

目录 1、引言 2、主要内容 2.1、定位对比&#xff1a;感知与规划的全维覆盖 2.2、数据与技术特性对比 2.3、技术协同&#xff1a;构建全栈研发生态 2.4、应用场景与评估体系 2.5、总结与展望 3、参考文献 1、引言 随着自动驾驶技术向全栈化迈进&#xff0c;Motional 团…...

[LUA ERROR] bad light userdata pointer

Cocos2d项目&#xff0c;targetSdkVersion30&#xff0c;在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer &#xff0c;导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...

【Java八股】JVM

JVM 1. jvm内存区域分为哪些部分 线程私有的&#xff1a;程序计数器、虚拟机栈、本地方法栈 程序计数器&#xff1a;指示当前线程执行到的字节码文件的行号&#xff0c;是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈&#xff1a;用于存储方法调用的数据&…...

集成学习(一):从理论到实战(附代码)

一、引言 在机器学习领域&#xff0c;打造一个独立、强大的算法是解决问题的关键。然而&#xff0c;集成学习提供了一种不同的视角&#xff1a;通过组合多个“弱”学习器来创建一个更强大的模型。本文探讨集成学习的思想、方法及其应用。 二、机器学习 vs 集成学习思想 传统…...

Netty:高性能网络应用框架的深度解析

引言 Netty 是由 JBoss 提供的一个开源的 Java NIO 客户端/服务器框架&#xff0c;它用以快速开发网络应用程序&#xff0c;如协议服务器和客户端。它的设计目标是提供异步事件驱动的网络应用程序框架&#xff0c;支持高效的网络通信和数据处理。Netty 在性能、可扩展性、安全…...

神经网络常见激活函数 3-ReLU函数(修正线性单元)

文章目录 ReLU函数求导函数和导函数图像优缺点pytorch 中的 ReLU 函数tensorflow 中的ReLU函数 ReLU 修正线性单元 &#xff08;Rectified Linear Unit&#xff09; 函数求导 ReLU函数 ReLU ⁡ max ⁡ ( 0 , x ) { x x ≥ 0 0 x < 0 \begin{aligned} \operatorname{ReL…...

Android开发获取缓存,删除缓存

Android开发获取缓存&#xff0c;删除缓存 app设置中往往有清理缓存的功能。会显示当前缓存时多少&#xff0c;然后可以点击清理缓存 直接上代码&#xff1a; object CacheHelper {/*** 获取缓存大小* param context* return* throws Exception*/JvmStaticfun getTotalCache…...

如何通过PHP接入DeepSeek的API

想知道如何通过PHP接入DeepSeek的API。看起来他对之前的Python步骤比较熟悉&#xff0c;但这次想用PHP实现。 首先&#xff0c;我需要回顾一下DeepSeek API的文档&#xff0c;确认它支持哪些方法和参数。假设用户已经配置了环境变量&#xff0c;比如API密钥&#xff0c;接下来…...

一种基于Leaflet.Legend的图例动态更新方法

目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术已经广泛应用于各个领域&#xff0c;…...

Spring Boot: 使用 @Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ

Spring Boot: 使用 Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ 在微服务架构中&#xff0c;确保消息的可靠性和一致性非常重要&#xff0c;尤其是在涉及到分布式事务的场景中。本文将演示如何使用 Spring Boot 的事务机制和 TransactionSynchron…...

LQB(2)-python-枚举

前言 python中的枚举一般有两个说法&#xff0c;一个是枚举算法&#xff08;暴力求解法&#xff0c;算法层面&#xff09;&#xff0c;一个是遍历使用enumerate()函数或者enum模块创建&#xff08;&#xff09;。 暴力求解法在之前的博文里面讲过了&#x1f447;&#xff0c;…...

MongoDB开发规范

分级名称定义P0核心系统需7*24不间断运行&#xff0c;一旦发生不可用&#xff0c;会直接影响核心业务的连续性&#xff0c;或影响公司名誉、品牌、集团战略、营销计划等&#xff0c;可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用&#xff0c;会间接影响用户使用…...

为什么DeepSeek服务器繁忙?

致敬DeepSeek 用户层面 用户数量激增&#xff1a;DeepSeek 免费且功能强大&#xff0c;对普通用户和开发者都极具吸引力124。尤其是在新功能推出、新模型上线或相关热门活动期间&#xff0c;大量用户会在短时间内涌入9。例如春节期间&#xff0c;DeepSeek 的用户量达到四千万7。…...

律所录音证据归集工具:基于PyQt6与多线程的自动化音频管理解决方案

在律所日常工作中&#xff0c;音频证据的整理与归集是一个高频且复杂的任务。面对大量的案件录音文件&#xff0c;如何实现快速且准确的分类与存档&#xff0c;成为了律所提高效率、降低出错率的关键。本文将通过技术角度解析一款名为律所录音证据归集工具的项目&#xff0c;详…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue旅游管理网站

开题报告 本论文探讨了一款采用现代Web开发技术构建的台州市旅游综合信息与服务平台的设计与实现。该系统基于SpringBoot框架&#xff0c;以其轻量级、快速开发和强大的企业级应用支持能力为核心后端技术支撑&#xff0c;结合Vue.js前端框架及ElementUI组件库&#xff0c;为用…...

unity碰撞的监测和监听

1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…...

DeepSeek-R1 32B Windows+docker本地部署

最近国产大模型DeepSeek兴起&#xff0c;本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件&#xff1a;Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama&#xff0c;它可以在本地运行和管理大模型。 到Ollama官网 https://ol…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...