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


===

相关推荐
夕泠爱吃糖7 小时前
HTTPS与HTPP的区别
网络协议·http·https
2501_915909067 小时前
“绑定 HTTPS” 的工程全流程 从证书配置到真机验证与故障排查
网络协议·http·ios·小程序·https·uni-app·iphone
追逐时光者8 小时前
一个基于 .NET 开源、功能强大的分布式微服务开发框架
后端·.net
笺上知微8 小时前
Serilog基于Seq开源框架实现日志分析
.net
百锦再8 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
CodeCraft Studio9 小时前
【能源与流程工业案例】KBC借助TeeChart 打造工业级数据可视化平台
java·信息可视化·.net·能源·teechart·工业可视化·工业图表
一个帅气昵称啊10 小时前
使用微软Agent Framework .NET构建智能代理应用
microsoft·flask·.net
一个天蝎座 白勺 程序猿11 小时前
深度解析:通过ADO.NET驱动Kdbndp高效连接与操作Kingbase数据库
数据库·.net·wpf·kingbase·金仓数据库
时光追逐者12 小时前
一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor)
c#·.net·wpf·流程图
我是唐青枫12 小时前
C#.NET FluentValidation 全面解析:优雅实现对象验证
c#·.net