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):验证客户端提供的证书链是否可信(在需要客户端证书的情况下)。同样,在代码中,这个方法也被空实现了

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

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

相关文章

禁止 iOS 系统浏览器双指放大页面

网上找到禁止ios缩放的方法基本都试过了,但是还是有bug,如标题所示,下面我将总结一下禁止ios缩放,双击缩放的方法。 方法一 在 iOS 10之前&#xff0c;iOS 和 Android 都可以通过一行 meta 标签来禁止页面缩放&#xff1a; <meta content"widthdevice-width, initia…

读西瓜书的数学准备

1&#xff0c;高等数学&#xff1a;会求偏导数就行 2&#xff0c;线性代数&#xff1a;会矩阵运算就行 参考&#xff1a;线性代数--矩阵基本计算&#xff08;加减乘法&#xff09;_矩阵运算-CSDN博客 3&#xff0c;概率论与数理统计&#xff1a;知道啥是随机变量就行

PLC通信

PLC&#xff08;可编程逻辑控制器&#xff09;通信是指 PLC 与其他设备或系统之间进行数据传输和信息交换的过程 一、PLC通信方式 1 &#xff09;串行通信 数据按位顺序依次传输&#xff0c;只需要一对传输线&#xff0c;成本低&#xff0c;传输距离长&#xff0c;但速度相对…

C/C++、网络协议、网络安全类文章汇总

&#x1f6f8; 文章简介 本文章主要对本博客的所有文章进行了汇总&#xff0c;方便查找。内容涉及C/C编程&#xff0c;CMake、Makefile、Shell脚本&#xff0c;GUI编程框架MFC和QT&#xff0c;Git版本控制工具&#xff0c;网络协议基础知识&#xff0c;网络安全领域相关知识&a…

java 中多线程、 队列使用实例,处理大数据业务

场景&#xff1a; 从redis 订阅数据 调用线程来异步处理数据 直接上代码 定义线程管理类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org…

【自动驾驶】4 智驾生态概述

目录 1 智驾生态概述 ▲ 关键组成部分 ▲ 概述 2 关键技术 ▲ 传感器 ▲ 感知 ▲ 数据闭环 3 未来市场 1 智驾生态概述 智能驾驶生态&#xff0c;简称智驾生态&#xff0c;是指围绕智能驾驶技术的开发、应用、服务和支持所形成的产业体系和合作网络。 涵盖了从硬件设…

2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计

题目来源&#xff1a;buuctf [RCTF2015]EasySQL1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;初步思路为二次注入&#xff0c;在页面进行操作 step 2&#xff1a;尝试二次注入 step 3&#xff1a;已知双引号类型的字符型注入&#xff0c;构造…

”彩色的验证码,使用pytesseract识别出来的验证码内容一直是空“的解决办法

问题&#xff1a;彩色的验证码&#xff0c;使用pytesseract识别出来的验证码内容一直是空字符串 原因&#xff1a;pytesseract只识别黑色部分的内容 解决办法&#xff1a;先把彩色图片精确转换成黑白图片。再将黑白图片进行反相&#xff0c;将验证码部分的内容变成黑色&#…

Unity3D项目开发中的资源加密详解

前言 在Unity3D游戏开发中&#xff0c;保护游戏资源不被非法获取和篡改是至关重要的一环。资源加密作为一种有效的技术手段&#xff0c;可以帮助开发者维护游戏的知识产权和安全性。本文将详细介绍Unity3D项目中如何进行资源加密&#xff0c;并提供相应的技术详解和代码实现。…

RabbitMQ 在实际应用时要注意的问题

1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…

AIGC视频生成明星——Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

Debian 上安装PHP

1、安装软件源拓展工具 apt -y install software-properties-common apt-transport-https lsb-release ca-certificates 2、添加 Ondřej Sur 的 PHP PPA 源&#xff0c;需要按一次回车&#xff1a; add-apt-repository ppa:ondrej/php 3、更新软件源缓存&#xff1a; apt-g…

office 2019 关闭word窗口后卡死未响应

最近关闭word文件总是出现卡死未响应的状态&#xff0c;必须从任务管理器才能杀掉word 进程&#xff0c;然后重新打开word再保存&#xff0c;很是麻烦。&#xff08;#其他特征&#xff0c;在word中打字会特别变慢&#xff0c;敲击键盘半秒才出现字符。&#xff09; office官网…

SecureUtil.aes数据加密工具类

数据加密、解密工具类 包含map和vo的数据转换 import cn.hutool.core.bean.BeanUtil; import cn.hutool.crypto.SecureUtil;import java.util.HashMap; import java.util.Map;/*** 数据解析**/ public class ParamUtils {/*** 数据解密** param params 参数* param secretKe…

机器学习:支持向量机

支持向量机&#xff08;Support Vector Machine&#xff09;是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的广义线性分类器&#xff0c;其学习策略便是间隔最大化&#xff0c;最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…

SQL-leetcode—1148. 文章浏览 I

1148. 文章浏览 I Views 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | ---------------------- 此表可能会存在重复行。&#xff08;换句话说…

k8s资源预留

k8s资源预留 https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources/ vim /var/lib/kubelet/config.yamlenforceNodeAllocatable: - pods kubeReserved: # 配置 kube 资源预留cpu: 500mmemory: 1Giephemeral-storage: 1Gi systemReserved: #…

[STM32 HAL库]串口空闲中断+DMA接收不定长数据

一、空闲中断 STM32的串口具有空闲中断&#xff0c;什么叫做空闲呢&#xff1f;如何触发空闲中断呢&#xff1f; 空闲&#xff1a;串口发送的两个字符之间间隔非常短&#xff0c;所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。触发条件…

Unity Line Renderer Component入门

Overview Line Renderer 组件是 Unity 中用于绘制连续线段的工具。它通过在三维空间中的两个或两个以上的点的数组&#xff0c;并在每个点之间绘制一条直线。可以绘制从简单的直线到复杂的螺旋线等各种图形。 1. 连续性和独立线条 连续性&#xff1a;Line Renderer 绘制的线条…

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析

一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言&#xff0c;以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具&#xff0c;仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…