天天看點

java模拟HTTP請求工具

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" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >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" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >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" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >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" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >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" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >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;
	}
}