HttpClient例子

package b.b;

import java.io.File; 
import java.io.FileInputStream; 
import java.nio.charset.Charset; 
import java.security.KeyStore; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import javax.net.ssl.SSLContext; 
 
import org.apache.http.Consts; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpHost; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.config.RequestConfig.Builder; 
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.HttpRequestBase; 
import org.apache.http.client.utils.URLEncodedUtils; 
import org.apache.http.config.Registry; 
import org.apache.http.config.RegistryBuilder; 
import org.apache.http.conn.HttpClientConnectionManager; 
import org.apache.http.conn.socket.ConnectionSocketFactory; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.conn.ssl.TrustSelfSignedStrategy; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.impl.conn.BasicHttpClientConnectionManager; 
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.ssl.SSLContexts; 
import org.apache.http.util.EntityUtils; 
 
/**
 * httpclient工具类  
 * <p>Description: httpclient版本4.4</p> 
 * <p>Author: desheng.tu</p> 
 * <p>Date: 2014年3月18日</p> 
 */ 
public class HttpUtils { 
 
    public static final String USER_AGENT_FIREFOX = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"; 
    public static final String USER_AGENT_CHROME = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"; 
    public static final String USER_AGENT_IE9 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"; 
    public static final String USER_AGENT_APPLE6 = "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"; 
    public static final String USER_AGENT = USER_AGENT_CHROME; 
 
 //request config 
 public static final Integer DEFAULT_CONN_TIMEOUT = 3000;//与主机建立链接的超时时间(毫秒) 
 public static final Integer DEFAULT_SO_TIMEOUT = 5000;//建立链接后,传输等待超时时间(毫秒) 
 public static final Integer DEFAULT_CONN_REQ_TIMEOUT = 3000;//向链接池请求链接超时时间(毫秒) 
 
 //pooling connect manager config 
 public static final Integer DEFAULT_CONN_POOL_SIZE = 200;//链接池大小 
 public static final Integer DEFAULT_MAX_PER_ROUTE = 200;//一个host的最大链接数 
 
    public static void main(String[] args) throws Exception { 
        CloseableHttpClient client = getSSLClient("haogrgr.keystore", "haogrgr"); 
        HttpGet get = new HttpGet("https://kyfw.12306.cn/otn/"); 
        CloseableHttpResponse exec = client.execute(get); 
        HttpEntity entity = exec.getEntity(); 
        if (entity != null) { 
            String content = EntityUtils.toString(entity); 
            System.out.println(content); 
        } 
         
        client.close(); 
    } 
 
    public static CloseableHttpClient getClient() { 
        return getClient(null); 
    } 
 
    /**
     * 获取默认的HttpClient对象 
     * @param proxy 代理host 
     * @return 
     */ 
    public static CloseableHttpClient getClient(HttpHost proxy) { 
        HttpClientBuilder builder = getClientBuilder(proxy); 
        return builder.build(); 
    } 
 
    public static CloseableHttpClient getThreadSafeClient() { 
        return getThreadSafeClient(null); 
    } 
     
    /**
     * 获取线程安全的HttpClient对象 
     * @param proxy 代理host 
     * @return 
     */ 
    public static CloseableHttpClient getThreadSafeClient(HttpHost proxy) { 
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); 
        cm.setMaxTotal(DEFAULT_CONN_POOL_SIZE); 
        HttpClientBuilder builder = getClientBuilder(proxy).setConnectionManager(cm); 
        return builder.build(); 
    } 
     
    public static CloseableHttpClient getSSLClient(File keyStoreFile, String pwd){ 
        return getSSLClient(null, false, keyStoreFile, pwd); 
    } 
     
    public static CloseableHttpClient getThreadSafeSSLClient(File keyStoreFile, String pwd){ 
        return getSSLClient(null, true, keyStoreFile, pwd); 
    } 
     
    public static CloseableHttpClient getSSLClient(String keyStoreFile, String pwd){ 
        File stroeFile = getStroeFile(keyStoreFile); 
        return getSSLClient(null, false, stroeFile, pwd); 
    } 
     
    public static CloseableHttpClient getThreadSafeSSLClient(String keyStoreFile, String pwd){ 
        File stroeFile = getStroeFile(keyStoreFile); 
        return getSSLClient(null, true, stroeFile, pwd); 
    } 
     
    public static CloseableHttpClient getSSLClient(HttpHost proxy, boolean threadSafe, String keyStoreFile, String pwd) { 
        File stroeFile = getStroeFile(keyStoreFile); 
        return getSSLClient(proxy, threadSafe, stroeFile, pwd); 
    } 
     
    /**
     * 获取支持Https的HttpClient对象 
     * @param proxy 代理host 
     * @param threadSafe 是否使用线程安全的HttpClient 
     * @param keyStoreFile 信任证书库文件 
     * @param pwd 证书库密码 
     * @return 
     */ 
    public static CloseableHttpClient getSSLClient(HttpHost proxy, boolean threadSafe, File keyStoreFile, String pwd) { 
        HttpClientBuilder builder = getClientBuilder(proxy); 
        try { 
            KeyStore trustStore = getTrustKeyStore(keyStoreFile, pwd); 
             
            SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build(); 
            SSLConnectionSocketFactory sslConnFactory = new SSLConnectionSocketFactory(sslContext); 
 
            RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create(); 
            Registry<ConnectionSocketFactory> registry = registryBuilder.register("https", sslConnFactory).build(); 
             
            HttpClientConnectionManager cm = null; 
            if(threadSafe){ 
                cm = new PoolingHttpClientConnectionManager(registry); 
                ((PoolingHttpClientConnectionManager)cm).setMaxTotal(DEFAULT_CONN_POOL_SIZE); 
            }else{ 
                cm = new BasicHttpClientConnectionManager(registry); 
            } 
 
            builder.setConnectionManager(cm); 
        } catch (Exception e) { 
            throw new RuntimeException("初始化HttpClient实例失败!", e); 
        } 
 
        return builder.build(); 
    } 
     
    public static void close(CloseableHttpClient client){ 
        try{ 
            client.close(); 
        }catch(Exception e){ 
            throw new RuntimeException("关闭实例失败", e); 
        } 
    } 
     
    /**
     * 将查询字符串附加到url后面 
     * @param url url 
     * @param query 查询字符串 
     * @return 拼接后的url 
     */ 
    public static String appendQureyString(String url, String query){ 
        if(isEmpty(url)){ 
            throw new IllegalArgumentException("the argument url is empty"); 
        } 
        if(isEmpty(query)){ 
            return url; 
        } 
        StringBuilder sb = new StringBuilder(url); 
        if(url.endsWith("?")){ 
            sb.append(query.startsWith("?") ? query.substring(1) : query); 
        }else{ 
            sb.append("?").append(query.startsWith("?") ? query.substring(1) : query); 
        } 
        return sb.toString(); 
    } 
     
    /**
     * 将参数转换为查询串 
     * @param paramMap 参数map 
     * @param charset 编码类型 
     * @return 例如: key1=value1&key2=value2 
     */ 
    public static String toUrlEncodeQueryString(Map<String, String> paramMap, String charset){ 
        List <NameValuePair> nvps = fromMap(paramMap); 
        String query = URLEncodedUtils.format(nvps, charset); 
        return query; 
    } 
     
    public static String toUrlEncodeQueryString(Map<String, String> paramMap){ 
        return toUrlEncodeQueryString(paramMap, "UTF-8"); 
    } 
     
    public static List <NameValuePair> fromMap(Map<String, String> paramMap){ 
        List <NameValuePair> nvps = new ArrayList <NameValuePair>(paramMap.size() + 1); 
         
        for (Map.Entry<String, String> entry : paramMap.entrySet()) { 
            String key = entry.getKey(); 
            if(key != null && key.trim().length() > 0){ 
                nvps.add(new BasicNameValuePair(key, entry.getValue())); 
            } 
        } 
         
        return nvps; 
    } 
     
    public static Map<String, String> parseQueryString(String queryString, String charset){ 
        List<NameValuePair> nvps = URLEncodedUtils.parse(queryString, Charset.forName(charset)); 
        return toMap(nvps); 
    } 
     
    public static Map<String, String> toMap(List <NameValuePair> nvps){ 
        HashMap<String, String> map = new HashMap<String, String>(); 
         
        for (NameValuePair pair : nvps) { 
            map.put(pair.getName(), pair.getValue()); 
        } 
         
        return map; 
    } 
     
    public static String entityToString(HttpEntity entity){ 
        return entityToString(entity, null); 
    } 
     
    /**
     * 将响应实体转换为String 
     * @param entity 响应实体 
     * @param charset 字符集 
     */ 
    public static String entityToString(HttpEntity entity, String charset){ 
        if(entity == null){ 
            return null; 
        } 
        try { 
            String content = null; 
            if(charset != null){ 
                content = EntityUtils.toString(entity, charset); 
            }else{ 
                content = EntityUtils.toString(entity); 
            } 
            return content; 
        } catch (Exception e) { 
            throw new RuntimeException("获取响应正文失败", e); 
        } 
    } 
     
    public static UrlEncodedFormEntity getFromEntity(Map<String, String> paramMap){ 
        List<NameValuePair> nvps = fromMap(paramMap); 
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvps, Consts.UTF_8); 
        return entity; 
    } 
     
    public static StringEntity getStringEntity(String content, String charset){ 
        StringEntity entity = new StringEntity(content, charset); 
        return entity; 
    } 
     
    public static StringEntity getStringEntity(String content){ 
        return getStringEntity(content, Consts.UTF_8.name()); 
    } 
     
    public static HttpClientBuilder getClientBuilder() { 
        return getClientBuilder(null); 
    } 
     
    public static String exec(HttpRequestBase request){ 
     try(CloseableHttpClient client = getClient()){ 
      CloseableHttpResponse response = client.execute(request); 
      String result = entityToString(response.getEntity()); 
      return result; 
     }catch(Exception e){ 
      throw new RuntimeException(e); 
     } 
    } 
     
    /**
     * 获取HttpClientBuilder对象,默认UserAgent为chrome 
     * 默认ConnectTimeout DEFAULT_CONN_TIMEOUT 1000 
     * 默认SocketTimeout DEFAULT_SO_TIMEOUT 3000 
     * @param proxy Http代理 
     * @return 
     */ 
    public static HttpClientBuilder getClientBuilder(HttpHost proxy) { 
        HttpClientBuilder builder = HttpClients.custom().setUserAgent(USER_AGENT); 
        if (proxy != null) { 
            builder.setProxy(proxy); 
        } 
 
        Builder requestConfigBuilder = RequestConfig.custom(); 
        requestConfigBuilder.setConnectionRequestTimeout(DEFAULT_CONN_REQ_TIMEOUT); 
        requestConfigBuilder.setConnectTimeout(DEFAULT_CONN_TIMEOUT); 
        requestConfigBuilder.setSocketTimeout(DEFAULT_SO_TIMEOUT); 
 
        builder.setDefaultRequestConfig(requestConfigBuilder.build()); 
         
        return builder; 
    } 
     
    /**
     * 获取证书库文件 
     * @param keyStorePath 路径,相当路径(classpath : /keyStorePath),或绝对路径 
     * @return 
     */ 
    private static File getStroeFile(String keyStorePath) { 
        File keyStoreFile = new File(keyStorePath); 
        if(!keyStoreFile.isAbsolute()){ 
            keyStoreFile = new File(HttpUtils.class.getResource("/").getFile() + keyStorePath); 
        } 
        return keyStoreFile; 
    } 
     
    /**
     * 导入证书到证书库中:<br> 
     * keytool -import -alias 12306 -keystore haogrgr.keystore -file c:\tmp\12306.cer<br> 
     * -keystore haogrgr.keystore 如果不存在haogrgr.keystore则会自动创建改文件 
     * @param keyStoreFile eg: haogrgr.keystore 
     * @param pwd 证书库密码 
     * @return 
     */ 
    private static KeyStore getTrustKeyStore(File keyStoreFile, String pwd) throws Exception { 
        KeyStore trustStore = null; 
        FileInputStream instream = null; 
        try { 
            trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
            instream = new FileInputStream(keyStoreFile); 
            trustStore.load(instream, pwd.toCharArray()); 
        } catch (Exception e) { 
            throw new RuntimeException("加载信任证书库失败!", e); 
        } finally { 
            instream.close(); 
        } 
        return trustStore; 
    } 
     
    private static boolean isEmpty(String str){ 
        return str == null || str.trim().length() == 0; 
    } 
}


测试:

package b.b;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Date;

import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class HTTP {
	
	public static final String USER_AGENT_FIREFOX = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"; 
    public static final String USER_AGENT_CHROME = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"; 
    public static final String USER_AGENT_IE9 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"; 
    public static final String USER_AGENT_APPLE6 = "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"; 
    public static final String USER_AGENT = USER_AGENT_CHROME; 
    
    //request config 
    public static final Integer DEFAULT_CONN_TIMEOUT = 30000;//与主机建立链接的超时时间(毫秒) 
    public static final Integer DEFAULT_SO_TIMEOUT = 50000;//建立链接后,传输等待超时时间(毫秒) 
    public static final Integer DEFAULT_CONN_REQ_TIMEOUT = 3000;//向链接池请求链接超时时间(毫秒) 
    
    //pooling connect manager config 
    public static final Integer DEFAULT_CONN_POOL_SIZE = 200;//链接池大小 
    public static final Integer DEFAULT_MAX_PER_ROUTE = 200;//一个host的最大链接数 
    

	public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException, ParseException, IOException{
		long time = new Date().getTime();
		String data = "{\"__app\":\"query2\",\"__type\":\"query2\",\"data\":[{\"__time\":"+time+",\"a1\":\"a1\",\"a2\":\"a1\",\"a3\":\"a1\",\"a4\":\"a1\"},{\"__time\":"+time+",\"a1\":\"b3\",\"a2\":\"a1\",\"a3\":\"a1\",\"a4\":\"a1\"},"
				+ "{\"__time\":"+time+",\"a1\":\"a3\",\"a2\":\"a1\",\"a3\":\"a1\",\"a4\":\"a1\"},{\"__time\":"+time+",\"a1\":\"b3\",\"a2\":\"a1\",\"a3\":\"a1\",\"a4\":\"a1\"}]}";
		
		CloseableHttpClient client = getHttpClient();
		HttpPost post = new HttpPost("https://192.168.130.240:9001/v2/events"); 
		HttpEntity p = new StringEntity(data,"utf-8");
    	post.setEntity(p);
        CloseableHttpResponse exec = client.execute(post); 
        HttpEntity entity = exec.getEntity(); 
        if (entity != null) { 
            String content = EntityUtils.toString(entity); 
            System.out.println(content); 
        }
         
        client.close(); 
	}
	
	public static HttpClientBuilder getClientBuilder(HttpHost proxy) { 
        HttpClientBuilder builder = HttpClients.custom().setUserAgent(USER_AGENT); 
        if (proxy != null) { 
            builder.setProxy(proxy); 
        } 
 
        Builder requestConfigBuilder = RequestConfig.custom(); 
        requestConfigBuilder.setConnectionRequestTimeout(DEFAULT_CONN_REQ_TIMEOUT); 
        requestConfigBuilder.setConnectTimeout(DEFAULT_CONN_TIMEOUT); 
        requestConfigBuilder.setSocketTimeout(DEFAULT_SO_TIMEOUT); 
 
        builder.setDefaultRequestConfig(requestConfigBuilder.build()); 
         
        return builder; 
    } 
	
	public static CloseableHttpClient getHttpClient() throws KeyManagementException, NoSuchAlgorithmException{
		SSLContext ctx = SSLContext.getInstance("SSL");
		X509TrustManager tm = new X509TrustManager(){

			public void checkClientTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
				// TODO Auto-generated method stub
				
			}

			public void checkServerTrusted(X509Certificate[] chain,
					String authType) throws CertificateException {
				// TODO Auto-generated method stub
				
			}

			public X509Certificate[] getAcceptedIssuers() {
				// TODO Auto-generated method stub
				return null;
			}
		};
		ctx.init( new KeyManager[0], new TrustManager[] {tm}, new SecureRandom());
		SSLContext.setDefault(ctx);
		
		SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(ctx,NoopHostnameVerifier.INSTANCE/*.getDefaultHostnameVerifier()*/);
		RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create(); 
        Registry<ConnectionSocketFactory> registry = registryBuilder.register("https", ssf).build(); 
		HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry);
		
		 HttpClientBuilder builder = getClientBuilder(null);
		 builder.setConnectionManager(ccm);
		 
		 return builder.build(); 
	}
}

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
	</dependency>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值