通用的HTTP请求类

来源:互联网 发布:火车票网络订单号查询 编辑:程序博客网 时间:2024/05/16 18:34
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);    }}

原创粉丝点击