使用 javax.net.ssl.HttpsURLConnection 发送 HTTP 请求_以及为了JWT通信选用OSS的Jar的【坑】

目录

1.代码

实现一

实现二

2.详细说明

3.JWT的OSS的Jar选用【坑】

4.不理解的事情

[5.JWT (JSON Web Token) 在API通信中的作用(简介)](#5.JWT (JSON Web Token) 在API通信中的作用(简介))


=========

1.代码

实现一

java 复制代码
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpsJsonPostRequest {
    
    /**
     * 发送HTTPS POST请求并返回响应内容
     * @param urlString 请求URL
     * @param jsonInputString JSON请求体
     * @return 服务器响应内容
     * @throws IOException 如果发生I/O错误
     */
    public static String sendJsonPostRequest(String urlString, String jsonInputString) throws IOException {
        // 创建URL对象
        URL url = new URL(urlString);
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        
        try {
            // 设置请求属性
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);
            
            // 设置连接和读取超时(可选)
            connection.setConnectTimeout(15000); // 15秒连接超时
            connection.setReadTimeout(15000);    // 15秒读取超时
            
            // 写入JSON数据到请求体
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
                os.write(input, 0, input.length);
            }
            
            // 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("POST Response Code: " + responseCode);
            
            // 读取响应内容
            if (responseCode == HttpsURLConnection.HTTP_OK) { // 成功
                try (BufferedReader br = new BufferedReader(
                        new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
                    StringBuilder response = new StringBuilder();
                    String responseLine;
                    while ((responseLine = br.readLine()) != null) {
                        response.append(responseLine);
                    }
                    return response.toString();
                }
            } else { // 错误响应
                try (BufferedReader br = new BufferedReader(
                        new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8))) {
                    StringBuilder errorResponse = new StringBuilder();
                    String responseLine;
                    while ((responseLine = br.readLine()) != null) {
                        errorResponse.append(responseLine);
                    }
                    return "Error: " + responseCode + "\n" + errorResponse.toString();
                }
            }
        } finally {
            connection.disconnect();
        }
    }
    
    public static void main(String[] args) {
        // 示例使用
        String url = "https://api.example.com/endpoint";
        String json = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
        
        try {
            String response = sendJsonPostRequest(url, json);
            System.out.println("Response: " + response);
        } catch (IOException e) {
            System.err.println("Error sending POST request: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

实现二

・OutputStream是一个字节流,它处理的是原始字节数据,而不是字符数据。String是字符序列,需要根据特定的字符编码(如UTF-8)转换为字节序列才能写入输出流。

・如果尝试直接传入String,编译器会报错,因为OutputStream.write()方法没有接受String参数的重载版本。

如果您想直接写入字符串,可以使用Writer类(如OutputStreamWriter),它是字符流到字节流的桥梁:

java 复制代码
try(OutputStream os = connection.getOutputStream();
    OutputStreamWriter writer = new OutputStreamWriter(os, StandardCharsets.UTF_8)) {
    writer.write(jsonInputString); // 这里可以直接写入String
    writer.flush();
}

====

2.详细说明

  1. 创建HTTPS连接 :使用HttpsURLConnection建立安全的HTTPS连接

  2. 设置请求属性

    • 请求方法设置为POST

    • 设置Content-Type和Accept头部为application/json

    • 启用输出流(setDoOutput(true))

    • 设置连接和读取超时(可选但推荐)

  3. 写入JSON数据:将JSON字符串转换为UTF-8字节并写入请求体

  4. 处理响应

    • 检查HTTP响应码

    • 对于成功响应(HTTP_OK/200),读取输入流

    • 对于错误响应,读取错误流

  5. 资源清理:使用try-with-resources确保正确关闭所有资源

===

3.JWT的OSS的Jar选用【坑】

我们的环境是Java8, JWT使用的OSS的jar的版本过高,造成想定外的错误

9.31版本,【可以正常运行】,但是版本过高,在WAS上发布后,造成服务器上的App自动停止。。。

9.9.3版本是JDK8编译的,可以正常使用,发布到WebSphere上没有问题。

4.不理解的事情

为什么能【可以正常运行】。。。,编译的版本高于JDK8,在java8上运行,不应该报

UnsupportedClassVersionError,

难道还能一部分是 8, 一部分是其它版本。。。。(待确认)

5.JWT (JSON Web Token) 在API通信中的作用(简介)

JWT 在现代应用架构,尤其是基于微服务和前后端分离的架构中,是身份认证 (Authentication) 和安全信息交换 的核心机制。它的主要作用可以概括为:一种无状态的、可自包含的、安全的身份凭证与信息交换格式。

===

下图直观地展示了基于 JWT 的认证与授权流程:


===

相关推荐
猫头_10 小时前
AI 流式传输工程指南:有了 EventSource 为何还要 Fetch?
javascript·http·llm
Chloeis Syntax10 小时前
JAVAEE初阶 --- 构造HTTP请求
网络·网络协议·http·postman
fen_fen15 小时前
麒麟 Linux aarch64安装.NET 6,并适配.net应用(达梦数据库)
linux·服务器·.net
触底反弹1 天前
前后端通信不是魔法,是 HTTP 协议、数据格式和浏览器安全机制共同演奏的交响曲
http·https·浏览器
山顶夕景1 天前
【MAE】音频自监督训练Masked Autoencoders that Listen
音视频·ssl·多模态·自监督·mae
froyoisle2 天前
阿里云免费 SSL 证书申请及配置
服务器·阿里云·ssl·网站
逑之2 天前
HTTP、HTTPS2
网络·网络协议·http
YYYing.2 天前
【C++大型项目之高性能服务器框架 (九) 】协议抽象与Http服务器模块
服务器·c++·http·高性能·c/c++·后端框架