client.HttpURLConnectionClient.java

package client;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import org.apache.log4j.Logger;

public class HttpURLConnectionClient {
	private final String POST="POST";
	private final String GET="GET";
	private final String UTF_8 = "UTF-8";
	
	private static HttpURLConnectionClient httpURLConnectionClient = new HttpURLConnectionClient();
	
	private HttpURLConnectionClient(){}
	
	public static HttpURLConnectionClient getInstance(){
		return httpURLConnectionClient;
	}
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	public String get(String requestUrl) {
        StringBuffer buffer = new StringBuffer();
        BufferedReader bufferedReader = null;
        OutputStream outputStream = null;
        HttpURLConnection httpUrlConn = null;

        try {
        	httpUrlConn = createHttpURLConnection(requestUrl);
            httpUrlConn.setRequestMethod(GET);
            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, UTF_8);
            bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            return buffer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
        	close(bufferedReader,outputStream,httpUrlConn);
        }
    }
	
	
	public String post(String requestUrl,Map<String,String> headers, String data) {
        StringBuffer buffer = new StringBuffer();
        BufferedReader bufferedReader = null;
        OutputStream outputStream = null;
        HttpURLConnection httpUrlConn = null;

        try {
        	httpUrlConn = createHttpURLConnection(requestUrl);
            httpUrlConn.setRequestMethod(POST);
            addHeaders(httpUrlConn,headers);
            // 当有数据需要提交时
            if (null != data) {
                outputStream = httpUrlConn.getOutputStream();
                // 注意编码格式,防止中文乱码
                outputStream.write(data.getBytes("UTF-8"));
                outputStream.flush();
            }

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, UTF_8);
            bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            return buffer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
        	close(bufferedReader,outputStream,httpUrlConn);
        }
    }
	
	public String httpsGet(String requestUrl) {
        StringBuffer buffer = new StringBuffer();

        BufferedReader bufferedReader = null;
        OutputStream outputStream = null;
        HttpsURLConnection httpUrlConn = null;

        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new NonAuthenticationX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            	
            httpUrlConn = (HttpsURLConnection) createHttpURLConnection(requestUrl);
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setRequestMethod(GET);

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, UTF_8);
            bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            return buffer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
        	close(bufferedReader,outputStream,httpUrlConn);
        }
    }
	
	public String httpsPost(String requestUrl, Map<String,String> headers,String data) {
        StringBuffer buffer = new StringBuffer();

        BufferedReader bufferedReader = null;
        OutputStream outputStream = null;
        HttpsURLConnection httpUrlConn = null;

        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new NonAuthenticationX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            httpUrlConn = (HttpsURLConnection) createHttpURLConnection(requestUrl);
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setRequestMethod(POST);
            addHeaders(httpUrlConn,headers);
            // 当有数据需要提交时
            if (null != data) {
                outputStream = httpUrlConn.getOutputStream();
                // 注意编码格式,防止中文乱码
                outputStream.write(data.getBytes(UTF_8));
                outputStream.flush();
            }

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, UTF_8);
            bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            return buffer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
        	close(bufferedReader,outputStream,httpUrlConn);
        }
    }
	
	/* ================================================== private methods ================================================== */
	private void addHeaders(HttpURLConnection httpURLConnection,Map<String,String> headers){
		if(headers==null){
			return;
		}
		for(Entry<String,String> header:headers.entrySet()){
			String key = header.getKey();
			String value = header.getValue();
			httpURLConnection.addRequestProperty(key, value);
		}
	}
	
	
	private HttpURLConnection createHttpURLConnection(String requestUrl){
		URL url = null;
		HttpURLConnection httpUrlConn = null;
		try {
			url = new URL(requestUrl);
			httpUrlConn = (HttpURLConnection) url.openConnection();
		} catch (Throwable e) {
			throw new RuntimeException(e);
		}
		httpUrlConn.setDoOutput(true);
		httpUrlConn.setDoInput(true);
		httpUrlConn.setUseCaches(false);
		return httpUrlConn;
	}
	
	private void close(BufferedReader bufferedReader,
					   OutputStream outputStream, 
					   HttpURLConnection httpUrlConn) {
		if(outputStream!=null){
            try{
                outputStream.close();
            }catch(Throwable e){
                logger.error("关闭流失败!",e);
            }
        }
        if(bufferedReader!=null){
            try{
                bufferedReader.close();
            }catch(Throwable e){
                logger.error("关闭流失败!",e);
            }
        }
        if(httpUrlConn!=null){
            try{
                httpUrlConn.disconnect();
            }catch(Throwable e){
                logger.error("关闭连接失败!",e);
            }
        }
	}
}

client.NonAuthenticationX509TrustManager.java

package client;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

class NonAuthenticationX509TrustManager implements X509TrustManager {
	@Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}