httpclient 支持代理和http & https

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;


/**
 * @author sprinng
 * @Description jdk >=1.7 兼容http https
 *
 */
public class HttpUtils {

    private static CloseableHttpClient httpClientBuilder=null;
    
    /**
     *    http 和 https 
     * @param useProxy 是否使用代理
     * @param needCert 是否需要证书
     * @return
     */
    private static CloseableHttpClient createSSLClientDefault(boolean useProxy,boolean needCert) {
        SSLConnectionSocketFactory sslsf = null;
        try {
            if(needCert){
                InputStream instream = new FileInputStream(new File("D:/cert/client.p12"));
                InputStream instream1 = new FileInputStream(new File("D:/cert/tbb.jks"));
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                KeyStore trustStore = KeyStore.getInstance("JKS");
                try {
                    //设置客户端证书
                    keyStore.load(instream, "12345678".toCharArray());
                    //设置服务器证书
                    trustStore.load(instream1, "12345678".toCharArray());
                } catch (Exception e) {
                    ECommonUtil.getLog().error("导入证书错误" + e);
                } finally {
                    if (instream != null) {
                        instream.close();
                    }
                    if (instream1 != null) {
                        instream1.close();
                    }
                }
                SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).loadKeyMaterial(keyStore, "12345678".toCharArray()).build();
                sslsf = new SSLConnectionSocketFactory(sslContext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            }else{
                SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType)
                            throws CertificateException {
                        return true;
                    }
                }).build();
                sslsf = new SSLConnectionSocketFactory(sslContext,new String []{"TLSv1.2"}, null,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            }
            if(useProxy){
                CredentialsProvider credsProvider = new BasicCredentialsProvider();
                AuthScope authScope = new AuthScope(PropertiesUtil.properties.getProperty("proxy_host"),Integer.parseInt(PropertiesUtil.properties.getProperty("proxy_port")));
                Credentials credentials = new  UsernamePasswordCredentials(PropertiesUtil.properties.getProperty("proxy_user"), PropertiesUtil.properties.getProperty("proxy_password"));
                credsProvider.setCredentials(authScope, credentials);
                httpClientBuilder= HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCredentialsProvider(credsProvider).build();
            }else{
                httpClientBuilder= HttpClients.custom().setSSLSocketFactory(sslsf).build();
            }
            return httpClientBuilder;
        } catch (Exception e) {
            ECommonUtil.getLog().error("创建https导入证书错误"+e);
        }
        return HttpClients.createDefault();
    }

    /**
     * 
     * @param url 请求地址
     * @param map 请求参数 
     * @param res 返回结果
     * @param timeOut 超时时间(min)
     * @param useProxy 是否使用代理
     * @return
     * @throws Exception
     */
    public static String get(String url,Map<String,String> map, String res, int timeOut, boolean useProxy, boolean needCert) throws Exception{
        RequestConfig config = null; CloseableHttpClient httpClient=null; CloseableHttpResponse response=null;
        if(httpClientBuilder==null){
            httpClient= HttpUtils.createSSLClientDefault(useProxy,needCert);
        }else{
            httpClient=httpClientBuilder;
        }
        URIBuilder uriBuilder=new URIBuilder(url);
        for (Entry<String, String> entry : map.entrySet()) {
            uriBuilder=uriBuilder.setParameter(entry.getKey(),entry.getValue());
        }
        URI uri=uriBuilder.build();
        HttpGet httpGet=new HttpGet(uri);
        try {
            if(useProxy){
                HttpHost proxy = new HttpHost(PropertiesUtil.properties.getProperty("proxy_host"), Integer.parseInt(PropertiesUtil.properties.getProperty("proxy_port")),"http");
                config = RequestConfig.custom().setProxy(proxy).setConnectTimeout(timeOut * 1000 * 60).build();
            }else{
                config = RequestConfig.custom().setConnectTimeout(timeOut * 1000 * 60).build();  
            }
            
            httpGet.setConfig(config);
            ECommonUtil.getLog().info("执行get请求" + httpGet.getRequestLine());
            response = httpClient.execute(httpGet);  
            HttpEntity entity = response.getEntity();  
            if (entity != null) {  
                ECommonUtil.getLog().info("响应状态:"+ response.getStatusLine()); 
                String rStr=EntityUtils.toString(entity,"UTF-8");
                ECommonUtil.getLog().info("响应内容:" + rStr);
                if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){
                    res=rStr;
                }
                EntityUtils.consume(entity);  
            }
        }catch (Exception e) {
            ECommonUtil.getLog().info("http请求错误"+e);
            throw e;
        }finally{
            if(httpGet!=null){
                httpGet.releaseConnection();
            }
            if(response!=null){
                response.close();
            }
            if(httpClient!=null){
                httpClient.close();
            }
        }
        return res;
    }
    
    /**
     * 
     * @param url 请求地址
     * @param params 请求参数
     * @param res 返回结果
     * @param timeOut 超时时间(min) 
     * @param useProxy 是否使用代理
     * @param needCert 是否使用证书
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "deprecation", "unused" })
    private static String post(String url, List<NameValuePair> params, String res, int timeOut, boolean useProxy, boolean needCert) throws Exception {
        RequestConfig config = null;CloseableHttpClient httpClient=null; CloseableHttpResponse response=null;
        if(httpClientBuilder==null){
            httpClient= HttpUtils.createSSLClientDefault(useProxy,needCert);
        }else{
            httpClient=httpClientBuilder;
        }
        HttpPost httpPost = new HttpPost(url);
        if(useProxy){
            HttpHost proxy = new HttpHost(PropertiesUtil.properties.getProperty("proxy_host"), Integer.parseInt(PropertiesUtil.properties.getProperty("proxy_port")),"http");
            config = RequestConfig.custom().setProxy(proxy).setConnectTimeout(timeOut * 1000 * 60).build();  
        }else{
            config = RequestConfig.custom().setConnectTimeout(timeOut * 1000 * 60).build();  
        }
        httpPost.setConfig(config);
        // 设置类型
        httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
        try {
            response = httpClient.execute(httpPost);
            if(302 == response.getStatusLine().getStatusCode()){
                ECommonUtil.getLog().info(response.getLastHeader("Location").getValue());
                post(response.getLastHeader("Location").getValue(), params, res, timeOut, useProxy,needCert);
            }
            HttpEntity entity = response.getEntity();
            res = EntityUtils.toString(entity, "UTF-8");
            ECommonUtil.getLog().info(res);
            EntityUtils.consume(entity);
        } catch (IOException e) {
            ECommonUtil.getLog().info("请求异常"+e);
            e.printStackTrace();
        } finally {
            if (response != null) {
                response.close();
            }
            if (httpPost != null) {
                httpPost.releaseConnection();
            }
            if (httpClient != null) {
                httpClient.close();
            }
        }
        return res;
    }
    
    public static void main(String[] args) throws Exception {
        //-----------post----------------
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("req", "{\"method\":\"checkMobile\",\"timestamp\":\"A100000000000001\",\"channelCode\":\"A1\",\"queryType\":\"1\",\"telephone\":\"15301929770\"}"));
//        HttpUtilsDemo.post("http://www.baidu.com", params,"",5,true);
//        HttpUtilsDemo.post("https://localhost/spdbSjptServer/service.cgi", params, "" , 5 ,false);
//        HttpUtilsDemo.post("http://localhost:7070/spdbSjptServer/service.cgi", params, "" , 5 ,false);
        //-----------get------------------
        String method = "{\"method\":\"checkMobile\",\"timestamp\":\"A100000000000001\",\"channelCode\":\"A1\",\"queryType\":\"1\",\"telephone\":\"15301929770\"}";
        Map<String, String> map = new HashMap<String, String>();
        map.put("req", method);
//        HttpUtilsDemo.get("https://localhost/spdbSjptServer/service.cgi", map,"",5,false);
        HttpUtils.get("http://localhost:7070/spdbSjptServer/service.cgi", map, "", 5, false,false);
//        HttpUtilsDemo.get("https://localhost/spdbSjptServer/service.cgi", map, "", 5, false,true);
//        HttpUtilsDemo.get("http://www.baidu.com", map, "", 5, true,false);
         }
    
}
import java.io.IOException;
import java.util.Properties;


public class PropertiesUtil {
    public static final Properties properties = new Properties();
    static {
         try {
          properties.load(PropertiesUtil.class.getClassLoader().getResourceAsStream("config.properties"));
         } catch (IOException e) { 
             ECommonUtil.getLog().error("初始config配置文件失败");
        }
    }
}
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

public class ECommonUtil {
    private static  Logger LOG = Logger.getLogger(ECommonUtil.class);

    public static Logger getLog() {
        return LOG;
    }
    
    public static void printSQL(String sql, Object... params) {
        getLog().info("SQL: " + sql);
        getLog().info("PARAMS: [" + StringUtils.join(params, ",") + "]");
    }
    
}

 

posted @ 2016-08-16 15:29  Earic  阅读(7792)  评论(1编辑  收藏  举报