Java发送HTTP/HTTPS请求工具类

news/2024/4/28 23:53:44/文章来源:https://blog.csdn.net/shencomd/article/details/137018086

基于原生JDK的发送HTTP/HTTPS请求工具类。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;/*** HTTP请求工具**/
public class HttpUtil {/*** 发送简单GET请求* * @param url 请求地址* @return 请求结果,出现异常返回null*/public static Result get(String url) {try {return sendRequest(url, "GET", null, 0, 0, null, null, null, Charset.forName("UTF-8"),Charset.forName("UTF-8"), false);} catch (KeyManagementException | NoSuchAlgorithmException | IOException e) {// TODOe.printStackTrace();}return null;}/*** 发送简单POST请求* * @param url  请求地址* @param body 请求体* @return 请求结果,出现异常返回null*/public static Result post(String url, String body) {try {return sendRequest(url, "POST", null, 0, 0, null, null, body, Charset.forName("UTF-8"),Charset.forName("UTF-8"), false);} catch (KeyManagementException | NoSuchAlgorithmException | IOException e) {// TODOe.printStackTrace();}return null;}/*** 发送简单POST请求* * @param url         请求地址* @param body        请求体* @param contentType 请求体类型* @return 请求结果,出现异常返回null*/public static Result post(String url, String body, String contentType) {Map<String, String> header = new HashMap<>();header.put("Content-Type", contentType);try {return sendRequest(url, "POST", null, 0, 0, header, null, body, Charset.forName("UTF-8"),Charset.forName("UTF-8"), false);} catch (KeyManagementException | NoSuchAlgorithmException | IOException e) {// TODOe.printStackTrace();}return null;}/*** 发送简单POST请求* * @param url    请求地址* @param body   请求体* @param header 请求头* @return 请求结果,出现异常返回null*/public static Result post(String url, String body, Map<String, String> header) {try {return sendRequest(url, "POST", null, 0, 0, header, null, body, Charset.forName("UTF-8"),Charset.forName("UTF-8"), false);} catch (KeyManagementException | NoSuchAlgorithmException | IOException e) {// TODOe.printStackTrace();}return null;}/*** 发送请求* * @param url            请求地址* @param methodType     请求类型,POST/GET* @param protocol       HTTPS使用的加密协议,传入null则使用SSL协议* @param connectTimeout 连接超时时间* @param readTimeout    读回应超时时间* @param header         请求头* @param cookie         cookie* @param body           请求体* @param outCharset     发送请求采用的字符编码* @param inCharset      读回应采用的字符编码* @param useCahces      是否启用缓存,建议false* @return 请求结果* @throws IOException              网络流异常* @throws KeyManagementException   证书异常* @throws NoSuchAlgorithmException 加密协议无效*/public static Result sendRequest(String url, String methodType, String protocol, int connectTimeout,int readTimeout, Map<String, String> header, Map<String, String> cookie, String body, Charset outCharset,Charset inCharset, boolean useCahces) throws IOException, KeyManagementException, NoSuchAlgorithmException {if (isBlankStr(url)) {throw new RuntimeException("未传入有效URL!URL=" + url);}if (url.trim().toLowerCase().startsWith("http://")) {return Http.sendRequest(url, methodType, connectTimeout, readTimeout, header, cookie, body, outCharset,inCharset, useCahces);} else if (url.trim().toLowerCase().startsWith("https://")) {return Https.sendRequest(url, methodType, protocol, connectTimeout, readTimeout, header, cookie, body,outCharset, inCharset, useCahces);} else {throw new RuntimeException("不是HTTP或HTTPS地址!URL=" + url);}}/*** 判断字符串是否无内容* * @param str* @return 无内容返回true,否则返回false*/private static boolean isBlankStr(String str) {int strLen;if (str == null || (strLen = str.length()) == 0) {return true;}for (int i = 0; i < strLen; i++) {if (!Character.isWhitespace(str.charAt(i))) {return false;}}return true;}/*** base64加密*/public static String base64Encode(String original) {try {return new String(Base64.getEncoder().encode(original.getBytes("UTF-8")));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}/*** base64解密字*/public static String base64Decode(String ciphertext) {try {return new String(Base64.getDecoder().decode(ciphertext.getBytes("UTF-8")));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}/**** MD5加密* * @param original 原文* @return 密文,字母小写*/public static String md5(String original) {try {MessageDigest md5 = MessageDigest.getInstance("MD5");// 此 MessageDigest 类为应用程序提供信息摘要算法的功能byte[] digest = md5.digest(original.getBytes("UTF-8")); // 转换为MD5码StringBuilder resultHexString = new StringBuilder();String tempStr;for (byte b : digest) {tempStr = Integer.toHexString(b & 0xff); // 这里需要对b与0xff做位与运算,若b为负数,强制转换将高位位扩展会导致错误,故需要高位清零if (tempStr.length() == 1) { // 若转换后的十六进制数字只有一位,则在前补"0"resultHexString.append(0).append(tempStr);} else {resultHexString.append(tempStr);}}return resultHexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}/*** 请求返回值模型*/public static class Result {private int code;// 请求返回的状态码private String content;// 请求返回的内容文本public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "Result [code=" + code + ", content=" + content + "]";}}/*** HTTP请求实现*/public static class Http {/*** @param url            请求地址* @param methodType     请求类型,POST/GET* @param connectTimeout 连接超时时间* @param readTimeout    读回应超时时间* @param header         请求头* @param cookie         cookie* @param body           请求体* @param outCharset     发送请求采用的字符编码* @param inCharset      读回应采用的字符编码* @param useCahces      是否启用缓存,建议false* @return 返回结果* @throws IOException 网络流异常*/public static Result sendRequest(String url, String methodType, int connectTimeout, int readTimeout,Map<String, String> header, Map<String, String> cookie, String body, Charset outCharset,Charset inCharset, boolean useCahces) throws IOException {HttpURLConnection con = null;//		// 添加请求参数
//		if (params != null) {
//			for (String headerKey : header.keySet()) {
//				con.setRequestProperty(headerKey, header.get(headerKey));// 设置请求属性
//			}
//		}URL urlObject = new URL(url);con = (HttpURLConnection) urlObject.openConnection(); // 得到连接对象con.setRequestMethod(methodType); // 设置请求类型// 连接超时时间if (connectTimeout >= 0) {con.setConnectTimeout(connectTimeout);}// 读取超时时间if (readTimeout >= 0) {con.setReadTimeout(readTimeout);}// 添加请求头if (header != null) {for (String headerKey : header.keySet()) {con.setRequestProperty(headerKey, header.get(headerKey));// 设置请求属性}}// 添加cookieif (cookie != null) {StringBuilder c = new StringBuilder();for (String name : cookie.keySet()) {String value = cookie.get(name);if (value == null) {continue;}value = URLEncoder.encode(value, outCharset.name());c.append(name + "=" + value + ";");}c.deleteCharAt(c.length() - 2);con.setRequestProperty("Cookie", c.toString());// 设置请求属性}con.setDoOutput(true); // 允许写出con.setDoInput(true); // 允许读入con.setUseCaches(useCahces);// 是否使用缓存// 写入请求体if (body != null) {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), outCharset));bw.write(body);bw.close();}int responseCode = con.getResponseCode(); // 得到响应码Result result = new Result();InputStream is = null;if (responseCode == HttpURLConnection.HTTP_OK) { // 正常返回状态码is = con.getInputStream();} else { // 400、401等其他错误类型is = con.getErrorStream();}BufferedReader in = null;in = new BufferedReader(new InputStreamReader(is, inCharset));StringBuilder resultBuffer = new StringBuilder();// 将响应流转换成字符串String line = "";while ((line = in.readLine()) != null) {resultBuffer.append(line);}result.setCode(responseCode);result.setContent(resultBuffer.toString());if (null != is) {is.close();}if (null != in) {in.close();}con.disconnect();// 关闭连接return result;}}/*** HTTPS类型请求实现*/public static class Https {/*** 发送请求* * @param url            请求地址* @param methodType     请求类型,POST/GET* @param protocol       HTTPS使用的加密协议,传入null则使用SSL协议* @param connectTimeout 连接超时时间* @param readTimeout    读回应超时时间* @param header         请求头* @param cookie         cookie* @param body           请求体* @param outCharset     是否启用缓存,建议false* @param inCharset      发送请求采用的字符编码* @param useCahces      读回应采用的字符编码* @return 返回结果* @throws IOException* @throws KeyManagementException   秘钥异常* @throws NoSuchAlgorithmException 找不到加密协议*/public static Result sendRequest(String url, String methodType, String protocol, int connectTimeout,int readTimeout, Map<String, String> header, Map<String, String> cookie, String body,Charset outCharset, Charset inCharset, boolean useCahces)throws IOException, KeyManagementException, NoSuchAlgorithmException {HttpsURLConnection connection = null;if (protocol == null) {protocol = "SSL";// 默认协议}trustAllHttpsCertificates(protocol);// 信任所有证书URL realUrl = new URL(url);connection = (HttpsURLConnection) realUrl.openConnection();// 转为HTTPSconnection.setHostnameVerifier(getHostnameVerifier());// 主机验证规则connection.setDoOutput(true);// 输出(发送数据)connection.setDoInput(true);// 输入(接收数据)connection.setUseCaches(useCahces); // 设置是否开启缓存,post请求时,缓存必须关掉connection.setRequestMethod(methodType); // 请求方法// 超时时间if (connectTimeout >= 0) {connection.setConnectTimeout(connectTimeout);}// 读取超时时间if (readTimeout >= 0) {connection.setReadTimeout(readTimeout);}// 添加请求头if (header != null) {for (String headerKey : header.keySet()) {connection.setRequestProperty(headerKey, header.get(headerKey));// 设置请求属性}}// 添加cookieif (cookie != null) {StringBuilder c = new StringBuilder();for (String name : cookie.keySet()) {String value = cookie.get(name);if (value == null) {continue;}value = URLEncoder.encode(value, outCharset.name());c.append(name + "=" + value + ";");}c.deleteCharAt(c.length() - 2);connection.setRequestProperty("Cookie", c.toString());// 设置请求属性}// 写入请求体if (body != null) {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), outCharset));bw.write(body);bw.flush();bw.close();}InputStream is = null;BufferedReader in = null;StringBuffer resultStr = new StringBuffer();int responseCode = connection.getResponseCode();// 请求响应码if (responseCode == HttpURLConnection.HTTP_OK) { // 正常返回状态码200is = connection.getInputStream();} else { // 400、401等其他错误类型is = connection.getErrorStream();}in = new BufferedReader(new InputStreamReader(is, inCharset));String line = "";while ((line = in.readLine()) != null) {resultStr.append(line);}Result result = new Result();result.setCode(responseCode);result.setContent(resultStr.toString());if (null != is) {is.close();}if (null != in) {in.close();}connection.disconnect();return result;}/*** 信任所有证书*/private static void trustAllHttpsCertificates(String protocol)throws KeyManagementException, NoSuchAlgorithmException {TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {return;}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {return;}public X509Certificate[] getAcceptedIssuers() {return null;}} };SSLContext sc = SSLContext.getInstance(protocol);sc.init(null, trustAllCerts, null);HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}/*** 所有主机验证都通过* * @return 主机验证对象*/private static HostnameVerifier getHostnameVerifier() {return new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}};}}
}

使用方式如下:

import java.io.IOException;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;import util.HttpUtil;public class Test {public static void main(String[] args) {HttpUtil.Result getResult = HttpUtil.get("http://127.0.0.1:8080");System.out.println(getResult.getContent());HttpUtil.Result psotResult1 = HttpUtil.post("http://127.0.0.1:8080/api/sms/send", "name=shencomd");System.out.println(psotResult1.getContent());HttpUtil.Result psotResult2 = HttpUtil.post("http://127.0.0.1:8080/api/sms/send", "{\"name\":\"shencomd\"}","application/json");System.out.println(psotResult2.getContent());String url = "https://127.0.0.1:8082/api/sms/send";// 请求地址String method = "POST";// 请求类型int connectTimeout = 0;// 连接超时时间int readTimeout = 0; // 读回应超时时间String protocol = "SSL";// 加密协议Map<String, String> header = new HashMap<>();// 请求头header.put("Content-Type", "application/json");Map<String, String> cookie = new HashMap<>();cookie.put("sessionid", "asiuqwenqweasga");String body = "{\"name\":\"shencomd\"}";// 请求体Charset outCharset = Charset.forName("utf-8"); // 发送请求采用的字符编码Charset inCharset = Charset.forName("utf-8"); // 读回应采用的字符编码boolean useCahces = false; // 是否启用缓存try {HttpUtil.Result psotResult3 = HttpUtil.sendRequest(url, method, protocol, connectTimeout, readTimeout,header, cookie, body, outCharset, inCharset, useCahces);if (psotResult3.getCode() == 200) {System.out.println(psotResult3.getContent());} else {System.out.println("请求发生错误,结果如下:");System.out.println(psotResult3.getContent());}} catch (KeyManagementException | NoSuchAlgorithmException | IOException e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026754.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象的学习

封装 //用来描述一类事物的类&#xff0c;专业叫做&#xff1a;javabean类 //在javabean类是不写main方法的//一个java文件中可以定义多个类&#xff0c;且只能一个类是public修饰&#xff0c;而且public修饰的类名必须成为代码的文件名 ://在类中一般无需指定初始化值 存在默…

智慧光伏:企业无纸化办公

随着科技的快速发展&#xff0c;光伏技术不仅成为推动绿色能源革命的重要力量&#xff0c;更在企业办公环境中扮演起引领无纸化办公的重要角色。智慧光伏不仅为企业提供了清洁、可持续的能源&#xff0c;更通过智能化的管理方式&#xff0c;推动企业向无纸化办公转型&#xff0…

鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比(2)

askPool运作机制 图1 TaskPool运作机制示意图 TaskPool支持开发者在主线程封装任务抛给任务队列&#xff0c;系统选择合适的工作线程&#xff0c;进行任务的分发及执行&#xff0c;再将结果返回给主线程。接口直观易用&#xff0c;支持任务的执行、取消。工作线程数量上限为4。…

基于Python实现多功能翻译助手(下)

为了将上述步骤中的功能增强与扩展具体化为代码&#xff0c;我们将实现翻译历史记录功能、翻译选项配置以及UI的改进。 翻译历史记录功能 import json # 假设有一个用于存储历史记录的json文件 HISTORY_FILE translation_history.json # 初始化历史记录列表 translati…

Element-Plus下拉菜单边框去除教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

python中函数那点事

1.求一个十进制的数值的二进制的0、1的个数 。 2.实现一个用户管理系统(要求使用容器保存数据)[{name: xxx, pass: xxx, ... ... },{},{}] 3.求1~100之间不能被3整除的数之和 4.给定一个正整数N,找出1到N(含)之间所有质数的总和 5.计算PI(公式如下:PI4(1-1/31/5-1/71/9-1......…

简单了解原型模式

什么是原型模式 区别于单例模式&#xff0c;原型模式的一个类可以有多个实例化的对象。 原型模式通过拷贝来产生新的对象&#xff0c;而不是new&#xff0c;并且可以根据自己的需求修改对象的属性。 实现Cloneable接口实现拷贝 而拷贝又分为浅拷贝和深拷贝&#xff0c;两者在…

Codigger开发者篇:开启全新的开发体验(二)

在数字化浪潮中&#xff0c;开发者们始终在追求更加高效、便捷的开发工具与环境。Codigger&#xff0c;作为新一代开发、运营、使用私人应用的分布式操作系统&#xff0c;正是为这些追求者们量身打造的利器&#xff0c;Codigger是一个跨时代的颠覆式的创新。今天&#xff0c;我…

【python】flask执行上下文context,请求上下文和应用上下文原理解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

硅谷甄选项目笔记

硅谷甄选运营平台 此次教学课程为硅谷甄选运营平台项目,包含运营平台项目模板从0到1开发&#xff0c;以及数据大屏幕、权限等业务。 此次教学课程涉及到技术栈包含***:vue3TypeScriptvue-routerpiniaelement-plusaxiosecharts***等技术栈。 一、vue3组件通信方式 通信仓库地…

华为ensp中vrrp虚拟路由器冗余协议 原理及配置命令

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言————— VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff0…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

SQLiteC/C++接口详细介绍sqlite3_stmt类(八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;九&#xff09; 27、sqlite3_column_int 函数 sqlite3_column_int 用于返…

[Flutter] Flutter多环境版本管理器Puro, 可是试试替换Fvm了

flutter2/3版本切换,除了fvm,还可以看看puro Puro官网 Mac安装方式 curl -o- https://puro.dev/install.sh | PURO_VERSION"1.4.5" bash因为puro安装flutter需要依赖git, 请确保mac支持git命令行 brew install git快速开始 先看效果 1.创建flutter环境 这里的…

Bayes-RF,基于贝叶斯Bayes优化算法优化随机森林RF数据回归预测(多输入单输出)-MATLAB实现

Bayesian optimization 是一种用于调节机器学习模型超参数的方法&#xff0c;而随机森林 (Random Forest, RF) 是一种强大的机器学习算法&#xff0c;常用于回归和分类任务。将它们结合起来可以提高模型性能&#xff0c;这就是 Bayes-RF 的基本思想。 下面是一个基于贝叶斯优化…

基于双vip+GTID的半同步主从复制集群项目(MySQL集群)

项目标题&#xff1a;基于keepalivedGTID的半同步主从复制MySQL集群 准备七台机器&#xff0c;其中有四台时MySQL服务器&#xff0c;搭建主从复制的集群&#xff0c;一个master&#xff0c;2个slave服务器&#xff0c;一个延迟备份服务器。同时延迟备份服务器也可以充当异地备…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Java安全 反序列化(4) CC1链-LazyMap版

Java安全 反序列化(4) CC1链-LazyMap版 实验环境:存在漏洞的版本 commons-collections3.1-3.2.1 jdk 8u71之后已修复不可利⽤ 文章目录 Java安全 反序列化(4) CC1链-LazyMap版一.跟踪挖掘CC1_LazyMap原理二.完整CC1_Lazy版Poc 接着上一篇文章我们通过ChainedTransFormer实现任意…

面试算法-122-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {return dfs(…