zoukankan      html  css  js  c++  java
  • 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, ",") + "]");
        }
        
    }
  • 相关阅读:
    136. Single Number
    125. Valid Palindrome
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    119. Pascal's Triangle II
    118. Pascal's Triangle
    集中式架构与分布式架构比较-copy
    分布式id产生-copy
    MySQL 5.7数据库参数优化-copy
    23个适合Java开发者的大数据工具和框架-copy
  • 原文地址:https://www.cnblogs.com/sprinng/p/5776587.html
Copyright © 2011-2022 走看看