通用的HTTP请求类

package cn.zytx.common.http;

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

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;

public class HttpUtil {
    public static final int CONNECT_TIMEOUT = 15000;
    public static final int READ_TIMEOUT    = 15000;
    public static final String POST_MEGHOD  = "POST";
    public static final String GET_MEGHOD   = "GET";
    private static final String FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8";
    private static final Logger logger    = LoggerFactory.getLogger(HttpUtil.class);

    public static String getHttp(String actionName) throws Exception{
        return getHttp(actionName,null,null);
    }
    /**
     * HTTP GET
     * @param actionName URL,可以帶參數
     * @param params 參數列表,可以为 null
     * @return
     * @throws Exception
     */
    public static String getHttp(String actionName, Map<String, String> params) throws Exception{
        return getHttp(actionName,params,null);
    }

    /**
     * HTTP GET
     * @param actionName URL,可以帶參數
     * @param params 參數列表,可以为 null
     * @param headers HTTP header 可以为 null
     * @return
     * @throws Exception
     */
    public static String getHttp(String actionName, Map<String, String> params,Map<String,String> headers) throws Exception{
        String paramString = contactMap(params);
        String url = actionName;
        if(!"".equals(paramString)) {
            url = actionName.contains("?")
                    ? actionName + "&" + paramString//如果包含?,則直接追加
                    : actionName + "?" + paramString;//不包含?,則用?追加
        }
        HttpURLConnection connect = (HttpURLConnection)new java.net.URL(url).openConnection();
        setConnectProperty(connect, GET_MEGHOD,null,headers);
        connect.connect();
        return getReturnMsg(connect);
    }

    /**
     * HTTP POST
     * @param actionName
     * @param params
     * @return
     * @throws IOException
     */
    public static String postHttp(String actionName, Map<String, String> params) throws IOException {
        return postHttp(actionName,params,null);
    }
    /**
     * HTTP POST
     * @param actionName
     * @param params
     * @param headers
     * @return
     * @throws IOException
     */
    public static String postHttp(String actionName, Map<String, String> params,Map<String,String> headers) throws IOException {
        HttpURLConnection connect = (HttpURLConnection)new java.net.URL(actionName).openConnection();
        setConnectProperty(connect,POST_MEGHOD,FORM_URLENCODED,headers);
        String paramString = contactMap(params);
        writeContent(connect,paramString);
        connect.connect();
        return getReturnMsg(connect);
    }

    public static String postHttp(String actionName, String body, String contentType) throws Exception{
        return postHttp(actionName,body,contentType,null);
    }

    /**
     *
     * @param actionName
     * @param body
     * @param contentType
     * @param headers
     * @return
     * @throws Exception
     */
    public static String postHttp(String actionName, String body, String contentType,Map<String,String> headers) throws Exception{
        HttpURLConnection connect = (HttpURLConnection)new java.net.URL(actionName).openConnection();
        setConnectProperty(connect,POST_MEGHOD,contentType, headers);
        writeContent(connect,body);
        connect.connect();
        return getReturnMsg(connect);
    }

    public static String postHttps(String actionName, String body, String contentType) throws Exception{
        return postHttps(actionName,body,contentType,null);
    }

    /**
     * HTTPS POST (HttpsURLConnection)说明只要URL是https的,自动打开的就是https,所以其实不用postHttps相关方法
     * @param actionName
     * @param body
     * @param contentType
     * @param headers
     * @return
     * @throws Exception
     */
    public static String postHttps(String actionName, String body, String contentType,Map<String,String> headers) throws Exception{
        HttpsURLConnection connect = (HttpsURLConnection)new java.net.URL(actionName).openConnection();
        setConnectProperty(connect,POST_MEGHOD, contentType,headers);
        writeContent(connect,body);
        connect.connect();
        return getReturnMsg(connect);
    }

    /**
     * key1=value1&key2=value2,如果value=null 或者 size=0 返回 ""
     * @param value
     * @return
     * @throws UnsupportedEncodingException
     */
    private static String contactMap(Map<String, String> value) throws UnsupportedEncodingException {
        if(null == value){return "";}
        String params = "";
        Iterator<String> iterator = value.keySet().iterator();
        while(iterator.hasNext()){
            String key = iterator.next().toString();
            params += key + "=" + URLEncoder.encode(value.get(key), "UTF8") + "&";
        }
        if(params.length() > 0){
            params = params.substring(0, params.length() - 1);
        }
        return params;
    }
    private static void writeContent(HttpURLConnection connect, String data) throws IOException {
        PrintWriter out = new PrintWriter(connect.getOutputStream());
        out.print(data);
        out.flush();
        out.close();
    }
    private static void setConnectProperty(HttpURLConnection connect, String method, String contentType, Map<String,String> headers) throws ProtocolException {
        connect.setRequestMethod(method);
        connect.setDoOutput(true);
        connect.setUseCaches(false);
        if(null != contentType){
            connect.setRequestProperty("Content-Type", contentType);
        }
        if(null != headers) {
            headers.forEach((key, value) -> connect.setRequestProperty(key, value));
        }
        connect.setConnectTimeout(CONNECT_TIMEOUT);
        connect.setReadTimeout(READ_TIMEOUT);
    }
    private static String getReturnMsg(HttpURLConnection connect) throws IOException {
        if( HttpURLConnection.HTTP_OK == connect.getResponseCode()){
            InputStream is = connect.getInputStream();
            ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
            int ch;
            while((ch = is.read()) != -1){
                bytestream.write(ch);
            }
            is.close();
            connect.disconnect();
            byte[] result = bytestream.toByteArray();
            return new String(result);
        } else{
            String err = errMessage(connect);
            logger.error(err);
            throw new RuntimeException(connect.getResponseCode() + "");
        }
    }

    private static String errMessage(HttpURLConnection connect) throws IOException {
        //如果服务器返回的HTTP状态不是HTTP_OK,则表示发生了错误,此时可以通过如下方法了解错误原因。
        InputStream is = connect.getErrorStream();    //通过getErrorStream了解错误的详情
        InputStreamReader isr = new InputStreamReader(is,"utf-8");
        BufferedReader in = new BufferedReader(isr);
        String inputLine;
        StringWriter bw = new StringWriter();
        while ((inputLine = in.readLine()) != null)
        {
            bw.write(inputLine);
            bw.write("\n");
        }
        bw.close();
        in.close();
        return bw.getBuffer().toString();
    }

    public static void main(String[] args) throws Exception{
        String s = getHttp("https://www.hao123.com/");
        System.out.println(s);
    }
}

猜你喜欢

转载自blog.csdn.net/xxssyyyyssxx/article/details/78552816
今日推荐