使用 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 的认证与授权流程:


===

相关推荐
REDcker3 小时前
HTTP请求数据包流转详解:localhost、127.0.0.1、公网 IP、公网域名访问时的数据流转
网络·tcp/ip·http
坐怀不乱杯魂7 小时前
Linux 网络 - HTTP -cookie session
网络·网络协议·http
PfCoder17 小时前
C#中定时器之System.Timers.Timer
c#·.net·visual studio·winform
Genie cloud18 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
mftang21 小时前
现代互联网安全的基石: SSL/TLS技术介绍
服务器·网络·ssl
ahxdyz1 天前
.NET平台MCP
ai·.net·mcp
の天命喵星人1 天前
.net 使用NLog记录日志
.net
绿荫阿广1 天前
将SignalR移植到Esp32—让小智设备无缝连接.NET功能拓展MCP服务
.net·asp.net core·mcp
吠品1 天前
什么是 IP SSL 证书?该如何申请
网络协议·tcp/ip·ssl
岚天start1 天前
Python HTTP服务器添加简单用户名密码认证的三种方案
服务器·python·http