java Http 工具

项目开发过程中,会经常用到http抓取,整理了个工具类
package com.suger.utils.http;

import com.alibaba.fastjson.JSONObject;
import com.suger.utils.Json;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

/**
 * http工具
 */
@Slf4j
public class HttpUtil {
    /**
     * 默认超时时间:10分钟
     */
    private static final int DefaultTimeOut = 1000 * 60 * 10;

    private final static HostnameVerifier DO_NOT_VERIFY = (hostname, session) -> true;

    /**
     * 支持https
     */
    private static SSLSocketFactory getSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException {
        TrustManager[] tm = {new MyTrustManager()};
        SSLContext sslContext = SSLContext.getInstance("TLS");

        sslContext.init(null, tm, new java.security.SecureRandom());
        return sslContext.getSocketFactory();
    }

    /**
     * 仅创建Http连接
     */
    public static HttpURLConnection createHttpConn(String requestUrl, String requestMethod, String requestData, String contentType, int timeoutMills) throws IOException, KeyManagementException, NoSuchAlgorithmException {
        log.info("url: " + requestUrl);

        URL url = new URL(requestUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        if (conn instanceof HttpsURLConnection) {
            HttpsURLConnection tmpConn = ((HttpsURLConnection) conn);
            tmpConn.setSSLSocketFactory(getSSLSocketFactory());
            tmpConn.setHostnameVerifier(DO_NOT_VERIFY);
        }

        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setConnectTimeout(timeoutMills);
        conn.setReadTimeout(timeoutMills);
        conn.setRequestMethod(requestMethod.toUpperCase());

        if (!StringUtils.isEmpty(contentType)) {
            conn.addRequestProperty("Content-Type", contentType);
        }

        if (null != requestData) {
            writeRequestData(conn.getOutputStream(), requestData);
        }

        return conn;
    }

    /**
     * 响应输出流处理,发送请求,获得文本
     */
    private static StringBuffer request(HttpURLConnection conn) throws IOException {
        StringBuffer buffer = new StringBuffer();
        try (
                InputStream inputStream = conn.getResponseCode() >= 400 ? conn.getErrorStream() : conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        ) {
            String str;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
        }

        return buffer;
    }

    /**
     * post写入流处理
     */
    private static void writeRequestData(OutputStream outputStream, String requestData) throws IOException {
        try (
                OutputStreamWriter outputStreamWriter =
                        new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
                BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)
        ) {
            bufferedWriter.write(requestData);
        }
    }

    /**
     * http[s]请求,返回JSON,若请求或转json失败,则返回null
     */
    public static Object requestOfJson(String requestUrl, String requestMethod, String requestData, String contentType) {
        HttpURLConnection conn = null;
        try {
            conn = createHttpConn(requestUrl, requestMethod, requestData, contentType, DefaultTimeOut);
            StringBuffer buffer = request(conn);

            return Json.parse(buffer.toString());
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        } finally {
            if (conn != null) {
                try {
                    conn.disconnect();
                } catch (Throwable e2) {
                    log.error("conn.disconnect:" + e2.getMessage());
                }
            }
        }
    }

    /**
     * http[s]请求,返回JSON,若请求或转json失败,返回JSONObject.put error = 1
     * conn.disconnect 失败时抛出异常
     */
    public static Object requestOfJsonNotNull(String requestUrl, String requestMethod, String requestData, String contentType, int timeout) {
        HttpURLConnection conn = null;
        StringBuffer resultStr = null;
        try {
            conn = createHttpConn(requestUrl, requestMethod, requestData, contentType, timeout);
            StringBuffer buffer = request(conn);
            resultStr = buffer;

            return Json.parse(buffer.toString());
        } catch (Throwable e) {
            e.printStackTrace();
            StringBuffer finalResultStr = resultStr;
            return new JSONObject() {{
                put("error", "1");
                put("msg", e.getClass().getSimpleName() + "," + e.getMessage() + "," + "result=" + finalResultStr);
            }};
        } finally {
            if (conn != null) {
                try {
                    conn.disconnect();
                } catch (Throwable e2) {
                    log.error("conn.disconnect:" + e2.getMessage());
                }
            }
        }
    }

    /**
     * 获取响应流,失败返回null
     */
    public static InputStream requestOfInputStream(String requestUrl, String requestMethod, String contentType, int timeout) {
        try {
            HttpURLConnection conn = createHttpConn(requestUrl, requestMethod, null, contentType, timeout);
            return conn.getInputStream();
        } catch (SocketTimeoutException e) {
            log.warn("获取http流超时:" + e.getMessage() + " " + requestUrl);
        } catch (Throwable ex) {
            log.warn(ex.getMessage() + " " + requestUrl);
        }

        return null;
    }
}
http | suger 2019-08-27 04:50:47