java模拟HTTP请求工具

2023-11-05


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * java模拟HTTP请求工具
 *
 * @author 99013
 * @ClassName HttpRequestUtil
 * @Description TODO
 * 作者:99013
 * 创建时间:2020年12月03日 14:07:35
 * @Version 2.0
 **/
public class HttpRequestUtil {
	private static final Logger log = LoggerFactory.getLogger(HttpRequestUtil.class);
	/**
	 * POST请求
	 */
	private static final String POST = "POST";
	/**
	 * PUT请求
	 */
	private static final String PUT = "PUT";
	/**
	 * GET请求
	 */
	private static final String GET = "GET";
	/**
	 * DELETE请求
	 */
	private static final String DELETE = "DELETE";
	/**
	 * utf-8
	 */
	public static final String CHARSET_UTF8 = "UTF-8";
	/**
	 * 请求内容类型
	 */
	public static final String CONTENT_TYPE = "Content-type";
	/**
	 * 请求通用格式
	 */
	public static final String CONTENT_TYPE_JSON = "application/json";
	/**
	 * multipart/form-data类型
	 */
	public static final String CONTENT_TYPE_FORMDATA = "multipart/form-data";
	/**
	 * text/plain类型
	 */
	public static final String CONTENT_TYPE_TEXT_PLAIN = "text/plain";
	/**
	 * image/jpeg类型
	 */
	public static final String MIME_TYPE_IMAGE_JPEG = "image/jpeg";
	/**
	 * 边界
	 */
	private static final String BOUNDARY = "----WebKitFormBoundary07I8UIuBx6LN2KyY";


	/**
	 * Get请求
	 *
	 * @param url       请求路径
	 * @param params    请求参数
	 * @param cookie    Cookie
	 * @param headerMap 请求头补充参数
	 * @return java.lang.String
	 * <br><br><b>作者: 990130556 <a class=b href="https://blog.csdn.net/lingdu_dou">lingdu</a></b><br>
	 * 创建时间: 2021年08月26日 18:46:43
	 */
	public static String sendGet(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap) {
		return send(GET, url, params, cookie, headerMap, null, null);
	}

	/**
	 * Delete请求
	 *
	 * @param url       请求路径
	 * @param params    请求参数
	 * @param cookie    cookie
	 * @param headerMap 请求头补充参数
	 * @return java.lang.String
	 * <br><br><b>作者: 990130556 <a class=b href="https://blog.csdn.net/lingdu_dou">lingdu</a></b><br>
	 * 创建时间: 2021年08月26日 18:48:02
	 */
	public static String sendDelete(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap) {
		return send(DELETE, url, params, cookie, headerMap, null, null);
	}

	/**
	 * Post请求
	 *
	 * @param url    第三方接口地址
	 * @param params 请求参数
	 * @return java.lang.String 返回信息
	 * <br><br><b>作者: 990130556 <a class=b href="https://blog.csdn.net/lingdu_dou">lingdu</a></b><br>
	 * 创建时间: 2020年12月03日 17:45:21
	 */
	public static String sendPost(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap) {
		return sendPostUplodFile(url, params, cookie, headerMap, null, null);
	}

	/**
	 * 模拟http请求上传文件及相关参数
	 *
	 * @param url      第三方上传文件地址
	 * @param fileName 文件名
	 * @param params   请求参数
	 * @param bytes    文件字节码
	 * @param cookie   Cookie
	 * @return java.lang.String
	 */
	public static String sendPostUplodFile(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap, String fileName, byte[] bytes) {
		return send(POST, url, params, cookie, headerMap, fileName, bytes);
	}

	/**
	 * put请求方式
	 *
	 * @param url    请求路径
	 * @param params 请求参数
	 * @param cookie cookie
	 * @return java.lang.String
	 * 创建时间: 2021年03月07日 09:16:34
	 */
	public static String sendPut(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap) {
		return send(PUT, url, params, cookie, headerMap, null, null);
	}

	/**
	 * put请求方式 上传文件
	 *
	 * @param url      请求路径
	 * @param fileName 文件名
	 * @param params   请求参数
	 * @param bytes    文件字节码
	 * @param cookie   cookie
	 * @return java.lang.String
	 * 创建时间: 2021年03月07日 09:16:34
	 */
	public static String sendPutUplodFile(String url, Map<String, Object> params, String cookie, Map<String, String> headerMap, String fileName, byte[] bytes) {
		return send(PUT, url, params, cookie, headerMap, fileName, bytes);
	}


	/**
	 * 执行请求
	 *
	 * @param type      请求类型
	 * @param url       第三方请求地址
	 * @param params    请求参数
	 * @param cookie    Cookie
	 * @param headerMap 补充请求头参数
	 * @param fileName  文件名
	 * @param bytes     文件字节码
	 * @return java.lang.String
	 * <br><br><b>作者: 990130556 <a class=b href="https://blog.csdn.net/lingdu_dou">lingdu</a></b><br>
	 * 创建时间: 2021年08月26日 18:21:34
	 */
	private static String send(String type, String url, Map<String, Object> params, String cookie, Map<String, String> headerMap, String fileName, byte[] bytes) {
		DataOutputStream out = null;
		BufferedReader in = null;
		StringBuilder result = new StringBuilder();
		try {
			// GET 和 DELETE 请求
			if (type.equals(GET) || type.equals(DELETE)) {
				if (params != null) {
					StringBuilder urlBuilder = new StringBuilder(url + "?");
					for (String s : params.keySet()) {// 防止中文乱码 ↓
						urlBuilder.append(s).append("=").append(URLEncoder.encode(params.get(s).toString(), "utf-8")).append("&");
					}
					url = urlBuilder.toString();
				}
			}
			//打开和URL之间的连接
			HttpURLConnection conn = getHttpUrlConnection(url, type, cookie, headerMap);
			// POST 和 PUT 请求
			if (type.equals(POST) || type.equals(PUT)) {
				out = new DataOutputStream(conn.getOutputStream());
				byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
				//添加参数
				if (params != null) {
					for (String key : params.keySet()) {
						String sb = "--" +
								BOUNDARY +
								"\r\n" +
								"Content-Disposition: form-data;name=\"" + key + "\"" +
								"\r\n" +
								"\r\n" +
								params.get(key) +
//								URLEncoder.encode(params.get(key).toString(), "utf-8")+
								"\r\n";
						out.write(sb.getBytes());
					}
				}
				// 传文件
				if (null != fileName && null != bytes) {
					//添加参数file
					String sb = "--" +
							BOUNDARY +
							"\r\n" +
							"Content-Disposition: form-data;name=\"file\";filename=\"" + fileName + "\"" +
							"\r\n" +
							"Content-Type: " + MIME_TYPE_IMAGE_JPEG +
							"\r\n" +
							"\r\n";
					out.write(sb.getBytes());
					// TODO 写文件
					out.write(bytes);
					out.write("\r\n".getBytes());
				}
				out.write(end_data);
				//flush输出流的缓冲
				out.flush();
			}
			//定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result.append(line);
			}
		} catch (Exception e) {
			log.error("发送请求出现异常:", e);
			e.printStackTrace();
		} finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		return result.toString();
	}

	/**
	 * 和URL之间建立连接
	 *
	 * @param url       请求路径
	 * @param type      请求类型
	 * @param cookie    cookie
	 * @param headerMap 请求头补充参数
	 * @return java.net.HttpURLConnection 返回连接信息
	 * <br><br><b>作者: 990130556 <a class=b href="https://blog.csdn.net/lingdu_dou">lingdu</a></b><br>
	 * 创建时间: 2021年09月02日 15:51:28
	 */
	private static HttpURLConnection getHttpUrlConnection(String url, String type, String cookie, Map<String, String> headerMap) throws IOException {
		URL realUrl = new URL(url);
		//打开和URL之间的连接
		HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
		if (POST.equals(type) || PUT.equals(type)) {
			//发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
		}
		conn.setUseCaches(false);
		conn.setRequestMethod(type);
		conn.setRequestProperty("connection", "Keep-Alive");
		conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
		conn.setRequestProperty("Charsert", CHARSET_UTF8);
		if (cookie != null) {
			conn.setRequestProperty("Cookie", cookie);
		}
		conn.setRequestProperty(CONTENT_TYPE, CONTENT_TYPE_FORMDATA + "; boundary=" + BOUNDARY);
		//填充请求头
		if (headerMap != null && headerMap.keySet().size() != 0) {
			for (String s : headerMap.keySet()) {
				conn.setRequestProperty(s, headerMap.get(s));
			}
		}
		conn.connect();
		return conn;
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java模拟HTTP请求工具 的相关文章

随机推荐

  • Detecting Twenty-thousand Classes using Image-level Supervision

    Detecting Twenty thousand Classes using Image level Supervision 摘要 背景方法 Preliminaries Detic 具有图像类别的检测器 loss 技术细节扩展 Grad
  • 台式机新装windows系统

    学校正版软件网页下载正版windows操作系统 windows官网下载U盘系统工具 根据电脑厂商按对应的Fn键启动bios设置 设置启动项为U盘启动 根据提示进行设置 新装操作系统后无法联网 没有以太网 参考https www xiaozh
  • provide和inject的用法

    1 provide与inject的功能 通过provide与inject 可以把一个祖先组件指定的数据和方法 传递给其所有子孙组件中 provide 和 inject 主要在开发高阶插件 组件库时使用 由于vue有 parent属性可以让子
  • Unity中用触摸控制物体旋转和放大

    using UnityEngine using System Collections using System IO public class ScaleAndRotate MonoBehaviour private Touch oldTo
  • Python编程从入门到实践(九)-文件和异常

    1 从文件中读取数据1 1 读取整个文件 要读取文件 需要一个包含几行文本的文件 下面首先来创建一个文件 它包含精确到小数点后30位的圆周率值 且在小数点后每10位处都换行 pi digits txt 3 1415926535 897932
  • Flink异步IO第一讲

    Async I O 是阿里巴巴贡献给社区的一个呼声非常高的特性 于1 2版本引入 主要目的是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题 对于实时处理 当需要使用外部存储数据染色的时候 需要小心对待 不能让与外部系统之间的交互延迟对
  • 起底高危RCE漏洞“Follina”:Windows系统无一幸免

    通告信息 上周末 独立网络安全研究团队 nao sec通过社交媒体表示 发现一份从白俄罗斯提交至分析服务网站VirusTotal的恶意微软Word文档 利用远程模板功能并通过 ms msdt MSProtocol URI模式执行恶意Powe
  • C/C++——new和delete的实现原理(详解)

    C C 内存管理 1 C C 内存分布 2 C语言中动态内存管理方式 2 1malloc calloc realloc free区别 3 C 中动态内存管理 new和delete 3 1new delete操作内置类型 3 2new del
  • AD22使用笔记+积累库

    一 前言 使用AD9习惯了 但是需求逐渐上来了就不够用了 好多快捷的新功能要新版本软件才能用 所以升级使用AD22 目录 1 添加层之后中间层无法布线 2 新增快捷方式Ctrl W布线 不用点图标了 二 环境 AD22 三 正文 1 添加层
  • [系统安全] 二十六.WannaCry勒索病毒分析 (2)MS17-010漏洞利用及蠕虫解析

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • SSH和SSM的区别

    1 定义 SSH Spring Struts2 Hibernate spring 为事务层 Struts2为控制器 hibernate 负责持久层 SSM springMVC为控制器 spring 为事务层 MyBatis 负责持久 都是当
  • gerber 文件格式 [一]

    在电路设计这块 目前还绕不开 gerber 文件的工程交互 所以来了解一下 目前官网的文档gerber layer format specification revision 2022 02 en pdf gerber 文件是一个ascii
  • 时序预测

    时序预测 MATLAB实现具有外生回归变量的ARIMAX时间序列预测 含AR MA ARIMA SARIMA VAR对比 目录 时序预测 MATLAB实现具有外生回归变量的ARIMAX时间序列预测 含AR MA ARIMA SARIMA V
  • 机器学习(二)深度学习实战-使用Kera预测人物年龄

    问题描述 我们的任务是从一个人的面部特征来预测他的年龄 用 Young Middle Old 表示 我们训练的数据集大约有19906多张照片及其每张图片对应的年龄 全是阿三的头像 测试集有6636张图片 首先我们加载数据集 然后我们通过深度
  • 本地部署体验LISA模型(LISA≈图像分割基础模型SAM+多模态大语言模型LLaVA)

    GitHub地址 https github com dvlab research LISA 该项目论文paper reading https blog csdn net Transfattyacids article details 132
  • jquery.webcam进行摄像头拍照

    最近由于项目要进行人像采集 所以就涉及到在web页面调用摄像头 进行拍照来获取图片 可以初来乍到 这技术又不是杠杠滴 所以在面对这有实现想法 但是又没有实现手段的时候 还是按照往常惯例找度娘 这个搜索过程可谓是无比艰辛 由于关键字不准确迟迟
  • WDK李宏毅学习笔记第十八周01_Meta learning-MAML and Gradient descent as LSTM

    Meta learning MAML and Gradient descent as LSTM 文章目录 Meta learning MAML and Gradient descent as LSTM 摘要 1 Meta learning
  • LO Frequency Plan

    概述 LO DIV是位于VCO和mixer之间的模块 其作用是分频和驱动长走线 设计难点在于底噪 不同的band有不同的频率覆盖范围 为了减小VCO的设计难度需要选择合适的分频方案 E UTRA规定的band与频率的对应关系在3GPP或wi
  • GNU/Linux下有多少是GNU的?

    原文地址 http coolshell cn articles 4826 html more 4826 一个葡萄牙的学生写了一篇文章 How much GNU is there in GNU Linux GNU Linux下有多少是GNU的
  • java模拟HTTP请求工具

    import org slf4j Logger import org slf4j LoggerFactory import java io BufferedReader import java io DataOutputStream imp