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

本文涉及的产品
云解析 DNS,旗舰版 1个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
全局流量管理 GTM,标准版 1个月
简介: 【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 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 9191 篇 Java SE 入门教程已发布完毕。


相关文章
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
3天前
|
安全 API 网络安全
使用OkHttp进行HTTPS请求的Kotlin实现
使用OkHttp进行HTTPS请求的Kotlin实现
|
17天前
|
前端开发 JavaScript 数据库
https页面加载http资源的解决方法
https页面加载http资源的解决方法
34 4
|
1月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
1月前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
67 1
|
2月前
|
前端开发 JavaScript 数据库
https页面加载http资源的解决方法
https页面加载http资源的解决方法
167 7
|
1月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
55 1
|
1月前
|
Java 数据处理 开发者
Java Http 接口对接太繁琐?试试 UniHttp 框架~
【10月更文挑战第10天】在企业级项目开发中,HTTP接口对接是一项常见且重要的任务。传统的编程式HTTP客户端(如HttpClient、Okhttp)虽然功能强大,但往往需要编写大量冗长且复杂的代码,这对于项目的可维护性和可读性都是一个挑战。幸运的是,UniHttp框架的出现为这一问题提供了优雅的解决方案。
66 0
|
2月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
141 2
|
1月前
|
小程序 Java
小程序通过get请求提交数据到java后台
小程序通过get请求提交数据到java后台
28 0