All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.gjing.http2.HttpHandle Maven / Gradle / Ivy

The newest version!
package cn.gjing.http2;

import cn.gjing.ParamUtil;
import cn.gjing.UrlUtil;
import cn.gjing.annotation.ExcludeParam;
import cn.gjing.annotation.NotNull;
import cn.gjing.enums.HttpType;
import cn.gjing.ex.HttpException;
import org.springframework.http.HttpMethod;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Set;

/**
 * @author Gjing
 **/
@SuppressWarnings("unchecked")
class HttpHandle {

    @NotNull
    static  T invokeUrl(String url, @ExcludeParam Map params, @ExcludeParam Map headers, Integer connectTimeout, Integer readTimeout, HttpMethod method,
                           Class responseType) {
        String paramsStr = null;
        if (ParamUtil.isNotEmpty(params)) {
            paramsStr = UrlUtil.paramUnicodeSort(params, false, false);
            //只有POST方法才能通过OutputStream(即form的形式)提交参数
            if (method != HttpMethod.POST) {
                assert paramsStr != null;
                url += "?" + paramsStr;
            }
        }
        URL uUrl;
        HttpURLConnection conn = null;
        BufferedWriter out = null;
        BufferedReader in = null;
        try {
            uUrl = new URL(url);
            if (ParamUtil.split(url, ":")[0].equals(HttpType.HTTPS.getType())) {
                SSLContext sslContext = SSLContext.getInstance("SSL");
                TrustManager[] tm = {new HttpsProcess()};
                sslContext.init(null, tm, new java.security.SecureRandom());
                SSLSocketFactory ssf = sslContext.getSocketFactory();
                HttpsURLConnection httpsConn = (HttpsURLConnection) uUrl.openConnection();
                httpsConn.setSSLSocketFactory(ssf);
                conn = httpsConn;
            } else {
                conn = (HttpURLConnection) uUrl.openConnection();
            }
            setProperty(connectTimeout, readTimeout, method, conn);
            addHeaders(headers, conn);
            if (paramsStr != null && method == HttpMethod.POST) {
                out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), Charset.defaultCharset()));
                out.write(paramsStr);
                out.flush();
            }
            StringBuilder result = null;
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), Charset.defaultCharset()));
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                result = new StringBuilder();
                String line;
                while ((line = in.readLine()) != null) {
                    result.append(line);
                }
            }
            return (T) (result != null ? result.toString() : null);
        } catch (Exception e) {
            throw new HttpException(e.getMessage());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void addHeaders(Map headers, HttpURLConnection conn) {
        if (ParamUtil.isNotEmpty(headers)) {
            Set headerSet = headers.keySet();
            for (String key : headerSet) {
                conn.setRequestProperty(key, (String) headers.get(key));
            }
        }
    }

    /**
     * 设置属性
     *
     * @param connectTimeout 超时时间
     * @param readTimeout    读超时
     * @param method         方法类型
     * @param conn           连接
     * @throws ProtocolException 协议异常
     */
    private static void setProperty(int connectTimeout, int readTimeout, HttpMethod method, HttpURLConnection conn) throws ProtocolException {
        conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
        conn.setRequestMethod(method.toString());
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setConnectTimeout(connectTimeout);
        conn.setReadTimeout(readTimeout);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy