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

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

本文讲解了如何使用 Java 发起 Http 请求,并给出了样例代码,HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议,Java 可以通过三方工具类发起 HTTP 请求。

一、什么是 http 和 https

HTTP 是一种用于在 Web 浏览器和 Web 服务器之间传输数据的协议。

HTTP 是一个无状态、面向连接的协议,使用 TCP 作为传输协议,默认运行在 80 8080 端口上。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();
            // 设置请求方法为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 对象。

接着,我们可以设置请求方法(如 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();
            // 设置请求方法为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 对象。

然后,我们可以设置请求方法(如 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();
            // 设置请求方法为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 等)和使用的库。

常用的数据解析库有: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 请求面试题

  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 9191 篇 Java SE 入门教程已发布完毕。


相关文章
|
12月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
1244 2
|
XML JSON API
识别这些API接口定义(http,https,api,RPC,webservice,Restful api ,OpenAPI)
本内容介绍了API相关的术语分类,包括传输协议(HTTP/HTTPS)、接口风格(RESTful、WebService、RPC)及开放程度(API、OpenAPI),帮助理解各类API的特点与应用场景。
|
Android开发 Kotlin
|
安全 网络安全 数据安全/隐私保护
网页安全演进:HTTP、HTTPS与HSTS
这整个进程实质上是网页安全由“裸奔”到“穿衣”再到“绑带”的演变史。它保障了数据的机密性和完整性,降低了中间人攻击的风险,最终实现了更自由、更安全的网络环境。但别忘了,技术永远在发展,网络安全的赛跑也永无终点。*ENDPOINT*
1419 11
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
547 19
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
1298 20
|
网络协议 安全 网络安全
HTTP与HTTPS协议入门
HTTP协议是互联网的基石,HTTPS则是其安全版本。HTTP基于TCP/IP协议,属于应用层协议,不涉及数据包传输细节,主要规定客户端与服务器的通信格式,默认端口为80。
1068 26
HTTP与HTTPS协议入门
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
813 12
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
798 1
|
安全 网络安全 数据安全/隐私保护
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
950 3

热门文章

最新文章