Java如何向http/https接口发出请求
用Java发送web请求所用到的包都在java.net
下,在具体使用时可以用如下代码,你可以把它封装成一个工具类
import javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;public class Testt {/*HostnameVerifier 是一个Java接口其中的verify方法用来在下面的类中提供主机名的SSL校验这里个人用不做具体校验所有的主机名都给过*/final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier(){public boolean verify(String arg0, SSLSession arg1) {return true;}};/*trustAllHosts方法 方法创建了一个 TrustManager 接口的匿名实现它是用来检查证书的,无论是服务器证书还是客户端证书这通过重写 checkServerTrusted 和 checkClientTrusted 方法为空 不做任何检查*/public static void trustAllHosts() {TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager(){public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[] {};}public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}}};/*SSLContext 使用上述的 TrustManager 初始化一个 SSLContext 实例并将其设置为 HttpsURLConnection 的默认 SSLSocketFactory这允许 HttpsURLConnection 信任所有SSL证书TLS是握手协议的一种*/try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}catch (Exception e) {e.printStackTrace();}}/*** 发出请求的具体方法* @param urlPath https协议接口的路径 https://xxxxxx* @param Json 发出请求需要携带的参数,需要是Json格式* @return*/public static String doPostToJson(String urlPath, String Json) {String result = "";BufferedReader reader = null;HttpURLConnection conn = null;try {/*掉用上面的静态方法,使得请求发出时,作为调用者的我们对服务端所拥有的任何https证书都是兼容的这里说一句题外话:一般情况下,作为接口使用者trustAllHosts方法里面的代码是不变的,因为你作为使用者总没道理说让人家服务端兼容你什么,除非你是证书的使用者,不过这种情况会有证书厂商告诉你如何做,不得不说厂商服务是个好东西*/trustAllHosts();URL url = new URL(urlPath);/*如果协议是 https,则使用 HttpsURLConnection 并设置 HostnameVerifier 为 DO_NOT_VERIFY。否则,使用 HttpURLConnection*/if (url.getProtocol().toLowerCase().equals("https")) {HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();httpsConn.setHostnameVerifier(DO_NOT_VERIFY);conn = httpsConn;}else {conn = (HttpURLConnection) url.openConnection();}// 设置请求以POST形式发出conn.setRequestMethod("POST");// 是否携带请求提,POST和GET请求必须为trueconn.setDoOutput(true);// 是否会获取服务端的响应,默认是trueconn.setDoInput(true);//禁用缓存conn.setUseCaches(false);// Keep-Alive告诉服务端对已有的TCP连接保持一定时间的活性,以保障后续发出的请求不需要建立新的TCP连接,从而减少网络开销conn.setRequestProperty("Connection", "Keep-Alive");//字符集,这个配置不是标准的请求头,但是有些妖孽系统会读取这个conn.setRequestProperty("Charset", "UTF-8");// 这个是请求格式,告诉服务端这个请求发送的是Json数据以及字符集conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");// 告诉服务端,相应格式也希望是json格式conn.setRequestProperty("accept", "application/json");//如果参数不为空则将参数以字节数流的方式写入请求体里面if (Json != null) {byte[] writebytes = Json.getBytes();conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));OutputStream outwritestream = conn.getOutputStream();outwritestream.write(Json.getBytes());outwritestream.flush();outwritestream.close();}//读取响应,相应数据也是一个jsonif (conn.getResponseCode() == 200) {reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));result = reader.readLine();}}catch (Exception e) {e.printStackTrace();}finally {//读取相应用的输入流需要在这里关闭,而写入请求参数的输出流是随用随关的if (reader != null) {try {reader.close();conn.disconnect();}catch (IOException e) {e.printStackTrace();}}}return result;}}
对于上面的代码,重点要说明的第一点是HostnameVerifier
接口提供的方法,它主要用于访问https协议下的接口时,验证当前已和你建立连接的hostname(主机名)和连接的SSLSession(SSL会话)证书是否匹配,防止中间人攻击,比如可以如下操作
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import java.io.IOException;
import java.net.URL;public class HostnameVerifierExample {public static void main(String[] args) {try {// 创建一个URL对象URL url = new URL("https://xxxxx");// 打开HTTPS连接HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();// 设置自定义的HostnameVerifierHostnameVerifier customVerifier = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {// 在这里实现你的验证逻辑// 例如,你可以比较hostname和session中的证书信息// 为了简单起见,这里我们直接接受任何主机名(不推荐这样做,有安全风险)// 在实际应用中,你应该根据你的安全策略来实现这个逻辑// 比如,你可以检查hostname是否与你预期的服务器主机名匹配// 或者,你可以使用HttpsURLConnection.getDefaultHostnameVerifier()来获取默认的验证器,并基于它的结果进行扩展// 这是一个不安全的示例,仅用于说明如何使用verify方法// 在实际应用中,你应该避免这样做return true; // 更安全的做法可能是这样的:// if ("expected.hostname".equals(hostname)) {// return true;// } else {// HostnameVerifier defaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();// return defaultVerifier.verify(hostname, session);// }}};// 设置自定义的HostnameVerifier到连接中connection.setHostnameVerifier(customVerifier);// 继续处理HTTPS连接,比如读取响应等// ...// 关闭连接connection.disconnect();} catch (IOException e) {e.printStackTrace();}}
}
第二是trustAllHosts
方法里面的东西,TrustManager
是用来实现证书验证的类,X509TrustManager
是X.509 证书的验证实现,通俗的讲是一个基础的证书,因此我上面的代码中也说了,如果你是正式的https证书使用者,会有厂商服务告诉你怎么验证证书
,在X509TrustManager
中提供了三个方法
getAcceptedIssuers():返回此信任管理器接受的发行者证书(根证书或中间证书)数组。在上面的代码中,这个方法返回了一个空数组,意味着它不做任何特定的发行者证书获取checkServerTrusted(X509Certificate[] certs, String authType):验证服务器提供的证书链是否可信。在代码中,这个方法被空实现了,意味着不会进行任何验证。checkClientTrusted(X509Certificate[] certs, String authType):验证客户端提供的证书链是否可信(在需要客户端证书的情况下)。同样,在代码中,这个方法也被空实现了
相关文章:

Java如何向http/https接口发出请求
用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一个工具类 import javax.net.ssl.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Outpu…...

数据分析 变异系数
目录 变异系数的应用场景包括: 特点: 注意事项: np.nanvar——方差,np.sanstd标准差 简单来讲就是平均值/标准差 变异系数(Coefficient of Variation, CV)是一种相对量的变异指标,常用于衡…...

利用免费GIS工具箱实现高斯泼溅切片,将 PLY 格式转换为 3dtiles
在地理信息系统(GIS)和三维数据处理领域,不同数据格式有其独特应用场景与优势。PLY(Polygon File Format)格式常用于存储多边形网格数据,而 3DTiles 格式在 Web 端三维场景展示等方面表现出色。将 PLY 格式…...

面试-二维数组
应用 快递业务有N个站点,1<N<10000;站点0、站点1可达,记作0-1;如果0-1、1-2,则站点0、站点2可达,记作0-2;s[i][j]1表示i-j可达,反之s[i][j]0表示i-j不可达;s[i][j…...

如何使用 findIndex() 方法查找数组中的第一个匹配元素的索引?
使用 findIndex() 方法查找数组中第一个匹配元素的索引 目录 简介findIndex() 方法概述如何使用 findIndex() 查找第一个匹配元素的索引 基本用法使用箭头函数和回调函数 实际项目中的代码示例 示例 1:查找第一个符合条件的用户索引示例 2:查找第一个符…...

5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)
目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…...

Centos类型服务器等保测评整/etc/pam.d/system-auth
修改服务器配置文件/etc/pam.d/system-auth,但是,把一下配置放在password的配置第一行才会生效 执行命令:配置口令要求:大小写字母、数字、特殊字符组合、至少8位,包括强制设置root口令! sed -i 14a pas…...

从工厂到桌面:3D打印制造潮玩手办
传统潮玩手办的制造过程复杂且成本高昂。从设计到成品,需要经过多道工序,包括手工建模、模具制作、注塑成型等。这一过程不仅耗时耗力,而且难以满足消费者日益增长的个性化需求。此外,传统制造方式对于小批量生产或定制化产品的经…...

Java高频面试之SE-16
hello啊,各位观众姥爷们!!!本牛马baby今天又来了!哈哈哈哈哈嗝🐶 Java中异常的处理方式有哪些? 在 Java 中,异常的处理方式主要有以下几种: 1. 使用 try-catch 语句 …...

三分钟简单了解一些HTML的标签和语法_01
1.图片建议建立一个文件夹如下图所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"keywords"><title>魔神羽落</title><style>.testone{background-color: #ff53e…...

缓存-Redis-数据结构-redis哪些数据结构是跳表实现的?
在 Redis 中,跳表(Skip List) 被用于实现 有序集合(Sorted Set) 数据结构。以下是对此实现的详细解释: Redis中的有序集合(Sorted Set) 有序集合(Sorted Set࿰…...

Linux 系统错误处理简介
Linux 系统错误处理简介 1. errno:错误代码的载体2. strerror():错误信息的翻译官3. perror():便捷的错误信息输出4. 系统调用与库函数的区别5. 错误处理的最佳实践 在 C/C 程序开发中,我们经常需要处理各种错误情况 Linux 系统提…...

逐笔成交逐笔委托Level2高频数据下载和分析:20250122
逐笔委托逐笔成交下载 链接: https://pan.baidu.com/s/1WP6eGLip3gAbt7yFKg4XqA?pwd7qtx 提取码: 7qtx Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交和逐笔委托这种每一笔的毫秒级别的数据可以分析出很多有用的点,包括主力意图,虚假动作&…...

第18个项目:微信开发入门:获取access_token的Python源码
源码下载地址:https://download.csdn.net/download/mosquito_lover1/90301829 功能特点: 输入AppID和AppSecret,点击按钮后异步获取access_token 1、自动保存功能: 当用户输入或修改 AppID 和 AppSecret 时自动保存 获取到新的 access_token 时自动保存 所有数据都保存在…...

如何将自己本地项目开源到github上?
环境: LLMB项目 问题描述: 如何将自己本地项目开源到github上? 解决方案: 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置,并且项目的 README.md 文件已经完善。检查是否有敏感信息࿰…...

Windows远程连接Docker服务
问题背景 本地开发了一个SpringBoot项目,想通过Docker部署起来,我本地是Window11系统,由于某些原因不能虚拟化并且未安装Docker-Desktop,所以我在想有没有办法本地不需要虚拟化也不需要安装Docker-Desktop来实现支持Docker命令远…...

在Qt中实现点击一个界面上的按钮弹窗到另一个界面
文章目录 步骤 1:创建新窗口类步骤 2:设计窗口的 UI步骤 3:设计响应函数 以下是一个完整的示例,展示在Qt中如何实现在一个窗口中通过点击按钮弹出一个新窗口。 步骤 1:创建新窗口类 假设你要创建一个名为 WelcomeWidg…...

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础
嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译? 4.为什么要交叉编译? 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…...

全氟醚橡胶发展前景:高性能密封材料的璀璨之星
在当今科技飞速发展的时代,各类高性能材料不断涌现,全氟醚橡胶便是其中一颗闪耀的明珠。它以其卓越的性能和广泛的应用领域,在众多关键行业中发挥着不可或缺的作用,展现出巨大的市场潜力和发展前景。 一、引言 全氟醚橡胶&#…...

Android程序中使用FFmpeg库
目录 前言 一、环境 二、创建APP 三. 添加FFmpeg库文件到app中 1. 复制ffmpeg头文件和so库到app中 2. 修改CMakeLists.txt文件内容. 3. 修改ffmpeglib.cpp 文件内容 4. 修改NativeLib.kt 文件添加方法和加载库 5. 调用 四. 增加解析视频文件信息功能 总结 前言 前面…...

Spring 依赖注入详解:创建 Bean 和注入依赖是一回事吗?
1. 什么是依赖注入(Dependency Injection,DI)? 依赖注入 是 Spring IoC(控制反转)容器的核心功能。它的目标是将对象的依赖(如其他对象或配置)从对象本身中剥离,由容器负…...

【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
本篇博客给大家带来的是01背包问题之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便…...

浅说树上差分——点差分
我们前面也学过差分,现在的话我们就把他放到树上来做。因为这是树,所以会有点和边之分,所以树上差分也会分为 点差分 和 边差分 。 引入 树上差分其实和线性差分没有什么区别,只不过是放到了树上的两点,而他们之间的…...

All in大模型!智能座舱语音交互决胜2025
大模型加速上车,AI智能座舱竞争更显白热化。 诚然,在语言大模型为核心的多模态能力加持下,智能语音助理能够理解复杂的语言指令,实现知识问答、文本生成等,以及根据上下文进行逻辑推理,提供更智能、准确的…...

windows git bash 使用zsh 并集成 oh my zsh
参考了 这篇文章 进行配置,记录了自己的踩坑过程,并增加了 zsh-autosuggestions 插件的集成。 主要步骤: 1. git bash 这个就不说了,自己去网上下,windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…...

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
读书笔记:卓越强迫症强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的…...

IDEA导入Maven工程不识别pom.xml
0 现象 把阿里 sentinel 项目下载本地后,IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects,再点击: 在出现的选择框中选择指定的未被识别的pom.xml即可: 2 Add as maven project 右键p…...

AT8870单通道直流电机驱动芯片
AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…...

计算机视觉算法实战——实体物体跟踪
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍✨✨ 实体物体跟踪(Object Tracking)是计算机视觉领域中的一个重要研究方向&#x…...

网络协议如何确保数据的安全传输?
网络协议作为计算机网络通信的基石,其设计不仅旨在实现数据的有效传输,更在于确保数据在传输过程中的安全性。对于网络协议如何保障数据安全传输,是很多企业和网络IT部门的重点,本文将从多方面概述相关方法。 加密与解密机制 1. …...