赞
踩
基于原生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) {
- // TODO
- e.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) {
- // TODO
- e.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) {
- // TODO
- e.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) {
- // TODO
- e.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;
- }
-
- @Override
- public 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));// 设置请求属性
- }
- }
-
- // 添加cookie
- if (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();// 转为HTTPS
- connection.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));// 设置请求属性
- }
- }
-
- // 添加cookie
- if (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) { // 正常返回状态码200
- is = 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() {
- @Override
- public 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();
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。