【JavaSE专栏91】Java如何主动发起Http、Https请求?

news2024/11/16 19:58:37

作者主页: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 HttpClientOkHttp 等)来发起 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();

            // 设置请求方法为GET
            connection.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 对象。

接着,我们可以设置请求方法(如 GETPOST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。

实际的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();
            
            // 设置请求方法为GET
            connection.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 对象。

然后,我们可以设置请求方法(如 GETPOST 等),获取响应状态码,读取响应内容并进行相应的处理,最后我们关闭连接。

这个示例代码中信任所有证书的操作并不安全,只适用于测试或开发环境,在生产环境中,建议同学们使用真实的证书和受信任的证书链进行验证。

在这里插入图片描述


四、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();
            
            // 设置请求方法为GET
            connection.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 等)和使用的库。

常用的数据解析库有:JSONObjectJSONArray(处理JSON数据)、SAXParserDOMParser(处理 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 请求面试题

  1. 请解释一下 Java 中的 HTTP 请求是如何工作的?
  2. 请介绍一下 Java 中常用的发送 HTTP 请求的类和库。
  3. 有哪些常见的 HTTP 请求方法?请给出它们的含义和用法。
  4. 如何在 Java 中发送一个 GET 请求?请给出示例代码。
  5. 如何在 Java 中发送一个 POST 请求?请给出示例代码。
  6. 如何处理 HTTP 请求的响应?如何获取响应的状态码和数据?
  7. 请解释一下 HTTP 的状态码,常见的状态码有哪些,它们分别代表什么意思?
  8. 在 Java 中如何处理 HTTP 请求的异常和错误?
  9. 如何设置 HTTP 请求的请求头(Headers)和请求参数(Parameters)?
  10. 在 Java 中如何处理 HTTP 请求的超时和重试?

六、总结

本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码, 91 91 91 篇 Java SE 入门教程已发布完毕。

在这里插入图片描述

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

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

相关文章

VMware标准虚拟交换机和分布式交换机

一、虚拟交换机 初期的网络虚拟化,是非常狭义的概念,主要指的是因为计算资源虚拟化,每台物理宿主机上安装了虚拟化软件,同时会部署了虚拟交换机,负责物理机上面承载的VM(虚拟机)之间与对外的通…

【Rust日报】2023-08-28 WASM 微运行时与 Rust

WASM 微运行时与 Rust 传统上,微控制器只能运行 C 代码。固件开发人员通常会使用 Eclipse 基于 IDE 以及定制的编译器工具链来编译代码。但是,MicroPython 最近变得流行起来。RaspberryPi Pico、ExpressIf 的 ESP32 是一些对 MicroPython 支持相当不错的…

直流电源开关TMI6240I/6250I——解决分立MOS开关易失效,安全更可靠

互联网时代带动了电子产品行业的发展,人们对电子产品的需求越来越高,TV、显示器、笔记本、智能家居、平板等产品只增不减,为生活提供了极大的便利。与此同时,随着拥有的电子产品增多也带来了不少”烦恼“——产品越多,…

标杆项目,获奖!

近日,第二届“光华杯”千兆光网应用创新大赛东部大区赛决赛在上海举行。天翼物联、南京港华燃气联合申报的“千兆光网融物赋智,赋能大型城市燃气安全及智慧运营”项目荣获三等奖并晋级全国总决赛。 今年以来,中国信息通信研究院联合中国通信标…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目,环境:JDK8,添加依赖:Spring Web、MyBatis FrameWork(最主要) 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包,名字为core,表示核心类…

2023最新Python重点知识万字汇总

这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点。由于总结了太多的东西,所以篇幅有点长,这也是作者"缝缝补补"总结了好久的东西。 **Py2 VS Py3** * print成为了函数,python2是关键字* 不再有unicode对象…

赢得明星代言:邀请明星成为品牌代言人的步骤与注意事项

在品牌推广和营销中,与明星合作做代言人是一种常见的策略,可以有效地提升品牌知名度和形象。然而,找明星做代言人并不是一件轻松的事情,需要慎重考虑和策划。媒介易拥有3000多位一二线明星合作资源,为您提供专业的明星…

基于java+springboot+vue的简历系统

​ 系统介绍: 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,简历系统当然也不能排除在外。简历系统是以实际运用为开发背景,运用软件工程原理和开发方…

基于Java的基数排序(详述)

基于Java的基数排序(详述) 原理介绍Java实现文献参考 原理介绍 一、什么是基数排序 (1)通过键值得各个位的值,将要排序的元素分配至一些桶中,达到排序的作用 (2)基数排序法是属于稳…

Mybatis1.3 查询详情

1.3 查询详情 1.3.1 编写接口方法1.3.2 编写SQL语句1.3.3 编写测试方法1.3.4 参数占位符1.3.5 parameterType使用1.3.6 SQL语句中特殊字段处理 有些数据的属性比较多,在页面表格中无法全部实现,而只会显示部分,而其他属性数据的查询可以通过 …

常用免费 API 接口推荐与分享,收藏备用

写在最前 各类免费 API 接口整理,主要是 LuckyCola上和其他各类开放平台上的一些,有需要的赶紧收藏备用。 一、LuckyCola免费api系列: 官网地址:LuckyCola 免费图床 | 智能对话机器人AI | 网站监控与免费API费图床是一款提供高质量图片上传与分享的平…

风丘方案助力车企升级 解决“国六”标准新难题

一 背景 尾气排放指标是衡量汽车质量和品质的主要指标之一,且汽车的尾气排放必须达到相应的标准才准许出厂,因此,对汽车排放的尾气进行检测是汽车生产过程的重要环节。汽车尾气检测过程是在排放实验室里进行的,这需要模拟汽车实际…

MySQL8.0.30一主两从复制与配置(一)

MySQL8.0.30一主两从复制与配置(一)_蜗牛杨哥的博客-CSDN博客 MySQL8.xx一主两从复制安装与配置 MySQL8.XX随未生成随机密码解决方案 本文主要对: MySQL8.xx安装与配置 的完善与补充 一: 搭建环境 主机IP 端口 节点备注192.168.1.100 …

Gazebo打不开,报错process has died[pid 7798, exit code1]解决办法

Gazebo打不开,报错process has died[pid 7798, exit code1],如下图所示: 原因:可能是由于有gazebo进程没有终止,所以无法打开。 解决办法:依次执行下面两个命令 killall gzserver killall gzclient问题解…

算法通关村-----位运算的规则

1 数字在计算机中的表示 机器数:一个数在计算机中的二进制表示 真值:带符号位的机器数对应的真正数值 机器数可分为原码、反码和补码。 原码:符号位加上真值的绝对值 反码:正数的反码是其本身,负数的反码的在其原…

基于ssm医院在线挂号预约系统源码和论文

基于ssm医院在线挂号预约系统源码和论文072 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 课题研究的目的及意义: 专家号难求,是医院现场挂号存在的主要问题之一,每一名专…

【算法专题突破】双指针 - 有效三角形的个数(5)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:611. 有效三角形的个数 - 力扣(Leetcode) 我们可以根据示例1来理解这一道题目, 他说数组里面的数可以组成三角形三条边的个数&#x…

maven的依赖下载不下来的几种解决方法

前言 每次部署测试环境,从代码库拉取代码,都会出现缺少包的情况。然后找开发一通调试,到处拷包。 方案一:pom文件注释/取消注释 注释掉pom.xml里的报红色的依赖(同时可以把本地maven库repo里对应的包删除)&…

ealtek高清晰音频管理器(realtek高清晰音频管理器怎么设置win10)

本文为大家介绍realtek高清晰音频管理器(realtek高清晰音频管理器怎么设置win10),下面和小编一起看看详细内容吧。 我们都使用电脑来听音乐、看电影或者进行其他操作,但是如果我们觉得电脑产生的音效不够立体,我们就会想要去Realtek来设置音…

【Maven】如何发现,定位,解决依赖冲突

发现冲突 运行的时候可能报出错误xx类找不到xx方法,xx类找不到,很有可能就是冲突导致的。 定位冲突根因 通过idea maven插件 idea安装插件,maven helper 比如我有两个依赖,guava和findbug。 他们都用到了jsr305,…