【JavaSE专栏91】Java如何主动发起Http、Https请求?
作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。
主打方向:Vue、SpringBoot、微信小程序
本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码,HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议,Java 可以通过三方工具类发起 HTTP 请求。

目录
- 一、什么是 http 和 https
- 二、如何发起 http 请求
- 三、如何发起 https 请求
- 四、http 请求的状态码和数据解析
- 五、http 请求面试题
- 六、总结
一、什么是 http 和 https
HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议。
HTTP 是一个无状态、面向连接的协议,使用 TCP 作为传输协议,默认运行在 80 80 80 端口上。HTTP 使用 请求-响应 模型,客户端发送 HTTP 请求到服务器,服务器根据请求返回相应的 HTTP 响应。
HTTPS 是一种加密的 HTTP 协议。它通过使用 SSL 或 TLS 协议来加密 HTTP 通信,以确保数据在传输过程中的安全性。
HTTPS 在 HTTP 之上加入了加密和身份验证的功能,使得数据在传输过程中更加安全可靠。
当客户端发起 HTTPS 请求时,服务器会返回一个公钥证书,客户端使用服务器的公钥加密通信。
在通信过程中,服务器使用私钥解密客户端发送的数据,客户端使用服务器的公钥加密发送的数据。
这样,即使有人截获了通信数据,也无法解密其中的内容,保护了数据的机密性和完整性。
HTTPS 常用于需要保护敏感信息传输的网站,如银行、电子商务和社交媒体等。
通过使用 HTTPS,可以有效防止窃听、篡改和伪装等网络攻击,提高了数据传输的安全性。

二、如何发起 http 请求
Java 可以使用 java.net.HttpURLConnection 或第三方库(如 Apache HttpClient、OkHttp 等)来发起 HTTP 请求,以下是一个使用 java.net.HttpURLConnection 发起 HTTP GET 请求的示例代码,请同学们复制到本地执行。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpExample {public static void main(String[] args) {try {// 创建URL对象URL url = new URL("http://api.example.com/data"); // 替换为实际的URL// 打开HTTP连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 获取响应状态码int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 打印响应内容System.out.println("Response Body: " + response.toString());// 关闭连接connection.disconnect();} catch (Exception e) {e.printStackTrace();}}
}
在这个示例中,我们首先创建 URL 对象,指定要请求的 URL。
然后,我们通过 url.openConnection() 打开 HTTP 连接,并将其强制转换为 HttpURLConnection 对象。
接着,我们可以设置请求方法(如 GET、POST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。
实际的HTTP请求可能需要处理更多的请求头、请求体、响应头等信息,使用第三方库可以提供更多的功能和便捷性。

三、如何发起 https 请求
Java 中可以使用 HttpsURLConnection 类发起 HTTPS 请求,以下是一个使用 HttpsURLConnection 发起 GET 请求的示例代码,请同学们复制到本地执行。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;public class HttpsExample {public static void main(String[] args) {try {// 创建信任管理器TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}public X509Certificate[] getAcceptedIssuers() { return null; }}};// 获取默认的SSL上下文SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());// 创建URL对象URL url = new URL("https://api.example.com/data"); // 替换为实际的URL// 打开HTTPS连接HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 获取响应状态码int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 打印响应内容System.out.println("Response Body: " + response.toString());// 关闭连接connection.disconnect();} catch (Exception e) {e.printStackTrace();}}
}
我们创建一个信任管理器,用于实现信任所有证书的操作。
然后,我们获取默认的 SSL 上下文,并将信任管理器应用于该 SSL 上下文。
接下来,我们创建 URL 对象,并使用 url.openConnection() 打开 HTTPS 连接,并将其强制转换为 HttpsURLConnection 对象。
然后,我们可以设置请求方法(如 GET、POST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。
这个示例代码中信任所有证书的操作并不安全,只适用于测试或开发环境,在生产环境中,建议同学们使用真实的证书和受信任的证书链进行验证。

四、http 请求的状态码和数据解析
Java中可以使用 HttpURLConnection 或第三方库来发起 HTTP 请求,并获取响应的状态码和数据。
首先,发起 HTTP 请求并获取响应的状态码可以使用以下代码,请同学们复制到本地执行。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpExample {public static void main(String[] args) {try {// 创建URL对象URL url = new URL("http://api.example.com/data");// 打开HTTP连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 获取响应状态码int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 打印响应内容System.out.println("Response Body: " + response.toString());// 关闭连接connection.disconnect();} catch (Exception e) {e.printStackTrace();}}
}
以上代码通过创建URL对象,并使用 url.openConnection() 打开HTTP连接,然后设置请求方法为 GET。
接着,通过 connection.getResponseCode() 获取响应的状态码,通过 connection.getInputStream() 获取响应的输入流,并使用 BufferedReader 逐行读取响应内容,最后打印响应内容并关闭连接。
然后,关于数据解析,具体如何解析响应数据取决于数据的格式(如 JSON、XML、HTML 等)和使用的库。
常用的数据解析库有:JSONObject 和 JSONArray(处理JSON数据)、SAXParser和DOMParser(处理 XML 数据)、Jsoup(处理 HTML 数据),当然还有其他许多第三方库可供选择。
这里以使用 JSONObject 解析 JSON 数据为例,给同学们一个参考。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;public class JsonExample {public static void main(String[] args) {String jsonData = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";try {JSONObject jsonObject = new JSONObject(jsonData);String name = jsonObject.getString("name");int age = jsonObject.getInt("age");String city = jsonObject.getString("city");System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("City: " + city);} catch (JSONException e) {e.printStackTrace();}}
}
以上代码将一个JSON字符串解析为 JSONObject,然后通过 getString(key) 和 getInt(key) 等方法获取对应字段的值。

五、http 请求面试题
- 请解释一下 Java 中的 HTTP 请求是如何工作的?
- 请介绍一下 Java 中常用的发送 HTTP 请求的类和库。
- 有哪些常见的 HTTP 请求方法?请给出它们的含义和用法。
- 如何在 Java 中发送一个 GET 请求?请给出示例代码。
- 如何在 Java 中发送一个 POST 请求?请给出示例代码。
- 如何处理 HTTP 请求的响应?如何获取响应的状态码和数据?
- 请解释一下 HTTP 的状态码,常见的状态码有哪些,它们分别代表什么意思?
- 在 Java 中如何处理 HTTP 请求的异常和错误?
- 如何设置 HTTP 请求的请求头(Headers)和请求参数(Parameters)?
- 在 Java 中如何处理 HTTP 请求的超时和重试?
六、总结
本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码, 91 91 91 篇 Java SE 入门教程已发布完毕。

相关文章:
【JavaSE专栏91】Java如何主动发起Http、Https请求?
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向:Vue、SpringBoot、微信小程序 本文讲解了如何使用…...
给oracle逻辑导出clob大字段、大数据量表提提速
文章目录 前言一、大表数据附:查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下(示例):Windows代码如下(示例):手工执行代码如下(示例)&…...
研发规范第九讲:通用类命名规范(重点)
研发规范第九讲:通用类命名规范(重点) 无规范不成方圆。我自己非常注重搭建项目结构的起步过程,应用命名规范、模块的划分、目录(包)的命名,我觉得非常重要,如果做的足够好ÿ…...
python+django+协同过滤算法-基于爬虫的个性化书籍推荐系统(包含报告+源码+开题)
为了提高个性化书籍推荐信息管理的效率;充分利用现有资源;减少不必要的人力、物力和财政支出来实现管理人员更充分掌握个性化书籍推荐信息的管理;开发设计专用系统--基于爬虫的个性化书籍推荐系统来进行管理个性化书籍推荐信息,以…...
系统架构:软件工程
文章目录 资源知识点自顶向下与自底向上形式化方法结构化方法敏捷方法净室软件工程面向服务的方法面向对象的方法快速应用开发螺旋模型软件过程和活动开放式源码开发方法功用驱动开发方法统一过程模型RUP基于构件的软件开发UML 资源 信息系统开发方法 知识点 自顶向下与自底…...
泰迪大数据实训平台产品介绍
大数据产品包括:大数据实训管理平台、大数据开发实训平台、大数据编程实训平台等 大数据实训管理平台 泰迪大数据实训平台从课程管理、资源管理、实训管理等方面出发,主要解决现有实验室无法满足教学需求、传统教学流程和工具低效耗时和内部教学…...
Linux- 文件夹相关的常用指令
1. 统计文件夹下的文件数量 在 Linux 下,有几种方法可以统计文件夹下的文件数量: 使用 ls 和 wc 命令: 这种方式可以统计目录下的直接子文件(不包括子目录里的文件)。 ls -l <目录路径> | wc -l注意:…...
在 macOS 中安装 TensorFlow 1g
tensorflow 需要多大空间 pip install tensorflow pip install tensorflow Looking in indexes: https://pypi.douban.com/simple/ Collecting tensorflowDownloading https://pypi.doubanio.com/packages/1a/c1/9c14df0625836af8ba6628585c6d3c3bf8f1e1101cafa2435eb28a7764…...
数学建模:CRITIC赋权法
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 CRITIC赋权法 算法流程 构建原始数据矩阵 X X X,他是一个 m ∗ n m * n m∗n 的矩阵, m m m 表示评价对象个数, n n n 表示指标个数对原始数据矩阵进行正向化处理计算…...
Facebook message tag 使用攻略
Messenger 讯息传不出去?无法发送FB 讯息给非好友? 2020年3月,Facebook 为了防止用户被过多的推广或垃圾讯息困扰而更新使用条款,现在商家要用FB传讯息给所有人(包括非好友),应该使用 Facebook …...
气传导耳机哪个品牌比较好?综合表现很不错的气传导耳机推荐
气传导耳机不仅能够提升幸福感还能听到周围环境声,大大提高安全性。如果你在寻找一款高品质的气传导耳机,又不知从何入手时,不要担心,我已经为你精心挑选了四款市面上综合表现很不错的气传导耳机,让你享受更好的音质…...
Rabbitmq的消息转换器
Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象 ,只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题: 数据体积过大 有安全漏洞 可读…...
nvidia-docker的使用
拉取镜像 docker pull nvidia/cuda可能出现的问题 问题描述 Error response from daemon: manifest for nvidia/cuda:latest not found: manifest unknown: manifest解决方法: 为找到正确且合适的docker镜像版本 在supported-tags中找到与自己系统对应的cuda版本…...
C++新经典 | C语言
目录 一、基础之查漏补缺 1.float精度问题 2.字符型数据 3.变量初值问题 4.赋值&初始化 5.头文件之<> VS " " 6.逻辑运算 7.数组 7.1 二维数组初始化 7.2 字符数组 8.字符串处理函数 8.1 strcat 8.2 strcpy 8.3 strcmp 8.4 strlen 9.函数 …...
物联网智慧种植农业大棚系统
一、项目背景 智慧农业是是将物联网技术和农业生产箱管理的新型农业,依托部署在农业生产现场的各种传感节点,以物联网网关为通道形成数据传输网络,可以实现控制柜、环境监测传感器、气象监测机器等设备的远程监控,达到及时高校的…...
TabBar组件如何跳转页面?
1、先引入 2、假数据 const tabs [{key: home,title: 首页,icon: <AppOutline />,badge: Badge.dot,},{key: todo,title: 待办,icon: <UnorderedListOutline />,badge: 5,},{key: message,title: 消息,icon: (active: boolean) >active ? <MessageFill /&…...
Vue.js中,router和route
<div class"search">{{$route.params.things}}<van-nav-bar fixed title"商品列表" left-arrow click-left"$router.go(-1)" /><van-searchreadonlyshape"round"background"#ffffff"value"手机"sh…...
【微服务】07-缓存
文章目录 为不同的场景设计合适的缓存策略1. 缓存是什么2. 缓存的场景3. 缓存的策略4. 缓存位置5. 缓存实现的要点6. 注意问题7. 使用的组件8. 内存缓存和分布式缓存区别 总结 为不同的场景设计合适的缓存策略 1. 缓存是什么 缓存是计算结果的“临时”存储和重复使用缓存本质…...
权限校验中的“双token”方案
1. 双Token中的两个token分别是什么? 1.1 access_token 1.2 fresh_token 2. 为什么需要双token?一个token不行吗? 答: 两个token的职责不同。其中,access_token是在每次请求的时候携带给后端进行权限校验ÿ…...
TensorFlow的基本概念
TensorFlow 是由 Google 开发的开源机器学习框架,其基本概念如下: 1. 张量(Tensor):TensorFlow 中最基本的数据结构,是多维数组,可以理解为向量或矩阵的推广。常见的张量有常量张量、变量张量和…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
