创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k

在 Java 生态中,HttpClientFeign 都是调用第三方接口的常用工具,但它们的定位、设计理念和使用场景有显著差异。以下是详细对比:


DIFF1. 定位与抽象层级

特性HttpClientFeign
层级底层 HTTP 客户端库(处理原始请求/响应)声明式 HTTP 客户端(基于接口和注解)
核心目标提供灵活的 HTTP 通信能力简化 REST 客户端开发,隐藏 HTTP 细节
依赖关系独立使用(如 Apache HttpClient/OkHttp)需依赖 HttpClient(默认集成 Ribbon/OkHttp)

DIFF2.性能与资源**

维度HttpClientFeign
启动开销低(直接使用)较高(需生成动态代理类)
运行时性能更优(无额外抽象层)轻微损耗(反射/动态代理)
连接池需手动配置 PoolingHttpClientConnectionManager自动复用底层 HttpClient 连接池
本文仅对HttpClient调用https接口调用做一个总结,先上代码:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustAllStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;
import java.nio.charset.StandardCharsets;/*** HTTPS 接口调用工具类* 包含 GET 和 POST 请求方法,支持自定义请求头和跳过证书验证(仅限测试环境)*/
public class HttpsClientUtil {/*** 发送 HTTPS GET 请求* @param url 请求地址* @param headers 请求头数组,格式为 {"key1:value1", "key2:value2"}* @return 响应内容* @throws Exception 如果请求过程中发生错误*/public static String doGet(String url, String[] headers) throws Exception {// 1. 创建支持 HTTPS 的 HttpClient 实例try (CloseableHttpClient httpClient = createHttpsClient()) {// 2. 创建 GET 请求对象HttpGet httpGet = new HttpGet(url);// 3. 设置请求头(如果有)if (headers != null) {for (String header : headers) {String[] kv = header.split(":");if (kv.length == 2) {httpGet.addHeader(kv[0].trim(), kv[1].trim());}}}// 4. 执行请求并获取响应HttpResponse response = httpClient.execute(httpGet);// 5. 解析响应内容HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, StandardCharsets.UTF_8);}return null;}}/*** 发送 HTTPS POST 请求(JSON格式)* @param url 请求地址* @param jsonBody JSON格式的请求体* @param headers 请求头数组* @return 响应内容* @throws Exception 如果请求过程中发生错误*/public static String doPost(String url, String jsonBody, String[] headers) throws Exception {try (CloseableHttpClient httpClient = createHttpsClient()) {// 1. 创建 POST 请求对象HttpPost httpPost = new HttpPost(url);// 2. 设置请求头和请求体httpPost.addHeader("Content-Type", "application/json");if (headers != null) {for (String header : headers) {String[] kv = header.split(":");if (kv.length == 2) {httpPost.addHeader(kv[0].trim(), kv[1].trim());}}}// 3. 设置 JSON 请求体if (jsonBody != null) {httpPost.setEntity(new StringEntity(jsonBody, StandardCharsets.UTF_8));}// 4. 执行请求并获取响应HttpResponse response = httpClient.execute(httpPost);// 5. 解析响应内容HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, StandardCharsets.UTF_8);}return null;}}/*** 创建支持 HTTPS 的 HttpClient 实例* 注意:此方法跳过证书验证,仅适用于测试环境!* 生产环境应使用正确的证书验证方式*/private static CloseableHttpClient createHttpsClient() throws Exception {// 1. 创建 SSLContext,配置信任所有证书(不安全,仅测试用)SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new TrustAllStrategy()) // 信任所有证书.build();// 2. 创建 SSL 连接工厂,跳过主机名验证SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE); // 跳过主机名验证// 3. 配置请求超时参数RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 连接超时 5秒.setSocketTimeout(10000) // 请求超时 10秒.setConnectionRequestTimeout(2000) // 从连接池获取连接超时 2秒.build();// 4. 创建 HttpClient 实例return HttpClients.custom().setSSLSocketFactory(sslSocketFactory) // 设置 SSL 工厂.setDefaultRequestConfig(requestConfig) // 设置超时配置.build();}/*** 测试方法*/public static void main(String[] args) {try {// 测试 GET 请求String getUrl = "https://jsonplaceholder.typicode.com/posts/1";String getResponse = doGet(getUrl, null);System.out.println("GET 响应:\n" + getResponse);// 测试 POST 请求String postUrl = "https://jsonplaceholder.typicode.com/posts";String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";String[] headers = {"Authorization: Bearer token123"};String postResponse = doPost(postUrl, jsonBody, headers);System.out.println("\nPOST 响应:\n" + postResponse);} catch (Exception e) {e.printStackTrace();}}
}

关键代码解析

1. 创建信任所有证书的 SSLContext

SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new TrustAllStrategy()) // 信任所有证书.build();
  • TrustAllStrategy 是 Apache HttpClient 提供的策略,会信任所有证书(包括自签名和过期证书)
  • 生产环境警告:这种配置不安全,只应在测试环境使用

2. 配置 SSL 连接工厂

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE); // 跳过主机名验证
  • NoopHostnameVerifier 会跳过主机名验证
  • 实际项目中应该使用 DefaultHostnameVerifier

3. 设置请求超时

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 连接超时 5秒.setSocketTimeout(10000) // 请求超时 10秒.setConnectionRequestTimeout(2000) // 从连接池获取连接超时 2秒.build();
  • 防止因网络问题导致线程长时间阻塞

4. 创建 HttpClient 实例

return HttpClients.custom().setSSLSocketFactory(sslSocketFactory) // 设置 SSL 工厂.setDefaultRequestConfig(requestConfig) // 设置超时配置.build();
  • 使用 try-with-resources 确保资源自动关闭

生产环境建议

  1. 不要跳过证书验证
    应配置正确的信任库:

    SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new File("/path/to/truststore.jks"), "password".toCharArray()).build();
    
  2. 使用连接池
    对于高频请求,应配置连接池:

    PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
    connManager.setMaxTotal(100);
    connManager.setDefaultMaxPerRoute(20);
    
  3. 添加重试机制
    对临时性网络错误实现自动重试

  4. 使用更现代的 HTTP 客户端
    考虑使用 OkHttp 或 Java 11+ 的 HttpClient

这个实现提供了完整的 HTTPS 调用功能,可以直接用于项目开发(测试环境)。

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

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

相关文章

从零基础到最佳实践:Vue.js 系列(7/10):《常用内置 API 与插件》

引言 Vue.js 是一款轻量且强大的前端框架,因其易用性和灵活性受到广泛欢迎。无论是初学者还是资深开发者,都可以通过其内置 API 和插件生态快速构建高效、可维护的 Web 应用。本文将从基础用法讲起,逐步深入到进阶技巧,结合大量实…

线性代数:AI大模型的数学基石

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

Java-System工具类深度解析

Java-System工具类深度解析 前言一、System 类概述1.1 基本定义与特点1.2 重要成员变量 二、标准输入输出功能2.1 标准输入(System.in)2.2 标准输出(System.out)2.3 标准错误输出(System.err) 三、系统属性…

删除用户凭证

Git 部分仓库无法操作,部分仓库没问题 问题出现 我用个人电脑修改了项目,提交了git。然后第二天在公司电脑git pull的时候失败,只有部分仓库,git colne直接失败,部分仓库无问题。 解决方式 删除git相关凭证&#xff…

19. 结合Selenium和YAML对页面实例化PO对象改造

19. 结合Selenium和YAML对页面实例化PO对象改造 一、架构升级核心思路 1.1 改造核心目标 # 原始PO模式:显式定义元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式:动态属性访问 self.username.send_keys(Tester) # 自动触发元素定…

鸿蒙App开发学习路径

以下是一份系统的鸿蒙(HarmonyOS)App开发学习路径,适合从零开始逐步掌握相关技能: 1. 基础知识储备 1.1 理解鸿蒙系统 鸿蒙核心特性:分布式能力、一次开发多端部署、原子化服务、ArkUI框架。与Android/iOS的区别&…

spring boot启动报错:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

错误代码 10061 通常表明无法建立到指定服务器的网络连接。这个错误属于 Windows Sockets 错误代码,具体指的是无法建立网络连接,通常是因为目标地址不可达。以下是一些解决此问题的步骤: 检查 IP 地址和端口: 确保你输入的 IP …

ARMv7的NVIC中断优先级

1. 优先级模型 数值规则:数值越小,优先级越高(例如优先级0的异常比优先级1的异常更高);若多个异常的优先级相同,则 异常号(Exception Number) 较小的异常优先执行。固定优先级异常(不可配置):异常类型 优先级值 说明 Reset -3 最高优先级(系统复位) NMI -2 不可屏…

gitee错误处理总结

背景 如上图,根据图片中的 Git 错误提示,我们遇到的问题是 ​本地分支落后于远程分支,导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交,而您的本地 master 分支未同步这些更新(即本…

阿里云合集(不定期更新)

一、阿里云申请免费域名证书流程:https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程:https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件:h…

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列&#xff08;Monotonic Queue&#xff09; 解决滑动窗口最大值问题的优化算法。我来简单解释一下&#xff1a; 核心思路 问题分析&#xff1a;在滑动窗口中&#xff0c;若存在两个下标 i < j 且 nums[i] ≤ nums[j]&#xff0c;则 nums[i] 永远…

小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解下

我们将继续计算机视觉内容的讲解。 我们已经知道了计算机视觉,用在什么地方,如何用Pytorch来处理数据,设定一些基础的设置以及模型。下面,我们将要解释剩下的部分,包括以下内容: 主题内容Model 1 :加入非线性实验是机器学习的很大一部分,让我们尝试通过添加非线性层来…

elementUI 单选框存在多个互斥的选项中选择的场景

使用 el-radio-group 来使用单选框组&#xff0c;代码如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">业务对象</el-radio><…

Qt项目开发中所遇

讲述下面代码所表示的含义&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget&#xff0c;将给其应用垂直管路布局。 2、新建一个…

相机标定与图像处理涉及的核心坐标系

坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD编译时遇到npm error code EINTEGRITY的问题

场景 CICD编译时抛出npm error code EINTEGRITY的错误 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot与Spring Security构建安全的RESTful API

使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中&#xff0c;安全性是一个不可忽视的重要方面。Spring Boot和Spring Security为开发者提供了一套强大的工具&#xff0c;用于构建安全的RESTful API。本文将详细介绍如何结合Spring Boot和Sp…

机器人拖动示教控制

机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…

RuoYi-Vue3-FastAPI框架的功能实现(上)

RuoYi-Vue3-FastAPI框架的功能实现&#xff08;上&#xff09; 感谢大佬给出关于python后端的若依框架&#xff0c;希望这个简单文档能帮助到大家。 安装与运行&#xff1a; 下载地址&#xff1a;Vue2版本&#xff1a; Gitte仓库地址&#xff1a;RuoYi-Vue-FastAPI: 基于Vu…

Paimon和Hive相集成

Paimon版本1.17 Hive版本3.1.3 1、Paimon集成Hive 将paimon-hive-connector.jar复制到auxlib中&#xff0c;下载链接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通过flink进入查看paimon /opt/softwares/flink-1…