开发手册 欢迎您!
软件开发者资料库

Java HttpClient使用PoolingHttpClientConnectionManager执行Get和Post请求方法及示例代码

本文主要介绍Java中使用HttpClient(org.apache.httpcomponents)的PoolingHttpClientConnectionManager执行Get和Post请求方法,以及相关示例代码。

1、HttpClient的pom.xml配置(maven依赖)


org.apache.httpcomponents
httpclient
4.5.6

2、使用PoolingHttpClientConnectionManager创建HttpClient

        //使用custom message parser / writer来定制HTTP        //消息被解析并写入数据流。.        HttpMessageParserFactory responseParserFactory = new DefaultHttpResponseParserFactory() {            @Override            public HttpMessageParser create(                    SessionInputBuffer buffer, MessageConstraints constraints) {                LineParser lineParser = new BasicLineParser() {                    @Override                    public Header parseHeader(final CharArrayBuffer buffer) {                        try {                            return super.parseHeader(buffer);                        } catch (ParseException ex) {                            return new BasicHeader(buffer.toString(), null);                        }                    }                };                return new DefaultHttpResponseParser(                        buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) {                    @Override                    protected boolean reject(final CharArrayBuffer line, int count) {                    //尝试无限忽略状态行前面的所有垃圾                        return false;                    }                };            }        };        HttpMessageWriterFactory requestWriterFactory = new DefaultHttpRequestWriterFactory();        //使用自定义连接工厂来自定义过程        //初始化传出的HTTP连接。除了标准的连接HTTP连接工厂可以定义消息        //用于单个连接的解析器/写入器例程        HttpConnectionFactory connFactory = new ManagedHttpClientConnectionFactory(                requestWriterFactory, responseParserFactory);        //客户端HTTP连接对象在完全初始化时可以绑定到        //一个任意的网络socket。网络套接字初始化的过程,        //它与远程地址的连接和与本地地址的绑定是受控制的        //通过连接socket工厂。        //安全连接的SSL上下文可以基于        //系统或应用程序特定的属性。        SSLContext sslcontext = SSLContexts.createSystemDefault();        // 为所支持的自定义连接套接字工厂创建一个注册        // protocol schemes.        Registry socketFactoryRegistry = RegistryBuilder.create()                .register("http", PlainConnectionSocketFactory.INSTANCE)                .register("https", new SSLConnectionSocketFactory(sslcontext))                .build();        // 使用自定义DNS解析器覆盖系统DNS解析。        DnsResolver dnsResolver = new SystemDefaultDnsResolver() {            @Override            public InetAddress[] resolve(final String host) throws UnknownHostException {                if (host.equalsIgnoreCase("myhost")) {                    return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };                } else {                    return super.resolve(host);                }            }        };        // 使用自定义配置创建连接管理器。        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(                socketFactoryRegistry, connFactory, dnsResolver);        // 创建套接字配置        SocketConfig socketConfig = SocketConfig.custom()                .setTcpNoDelay(true)                .build();        //将连接管理器配置为使用socket配置        //默认或为特定的主机。        connManager.setDefaultSocketConfig(socketConfig);      //connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);        // 1秒不活动后验证连接        connManager.setValidateAfterInactivity(1000);        // 创建消息的约束        MessageConstraints messageConstraints = MessageConstraints.custom()                .setMaxHeaderCount(200)                .setMaxLineLength(2000)                .build();        // 创建连接配置        ConnectionConfig connectionConfig = ConnectionConfig.custom()                .setMalformedInputAction(CodingErrorAction.IGNORE)                .setUnmappableInputAction(CodingErrorAction.IGNORE)                .setCharset(Consts.UTF_8)                .setMessageConstraints(messageConstraints)                .build();        //配置连接管理器来使用连接配置        //默认或为特定的主机。        connManager.setDefaultConnectionConfig(connectionConfig);      //connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT);        //为持久连接配置总最大或每个路由限制        //连接管理器可以在连接池中保存或租用。        connManager.setMaxTotal(100);        connManager.setDefaultMaxPerRoute(10);//connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);        // 如有必要,使用自定义cookie存储。        CookieStore cookieStore = new BasicCookieStore();        // 如有必要,使用自定义证书提供程序。        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();        // 创建全局请求配置        RequestConfig defaultRequestConfig = RequestConfig.custom()                .setCookieSpec(CookieSpecs.DEFAULT)                .setExpectContinueEnabled(true)                .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))                .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))                .build();        // 使用给定的自定义依赖项和配置创建HttpClient。.        CloseableHttpClient httpClient = HttpClients.custom()                .setConnectionManager(connManager)                .setDefaultCookieStore(cookieStore)                .setDefaultCredentialsProvider(credentialsProvider)        //.setProxy(new HttpHost("myproxy", 8080))                .setDefaultRequestConfig(defaultRequestConfig)                .build();

3、使用HttpClient执行GET和POST请求示例代码

import com.alibaba.dcm.DnsCacheManipulator;import org.apache.http.*;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.CookieStore;import org.apache.http.client.CredentialsProvider;import org.apache.http.client.config.AuthSchemes;import org.apache.http.client.config.CookieSpecs;import org.apache.http.client.config.RequestConfig;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.*;import org.apache.http.conn.*;import org.apache.http.conn.HttpConnectionFactory;import org.apache.http.conn.routing.HttpRoute;import org.apache.http.conn.socket.ConnectionSocketFactory;import org.apache.http.conn.socket.PlainConnectionSocketFactory;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.entity.StringEntity;import org.apache.http.impl.DefaultHttpResponseFactory;import org.apache.http.impl.client.BasicCookieStore;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.impl.conn.*;import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;import org.apache.http.io.HttpMessageParser;import org.apache.http.io.HttpMessageParserFactory;import org.apache.http.io.HttpMessageWriterFactory;import org.apache.http.io.SessionInputBuffer;import org.apache.http.message.BasicHeader;import org.apache.http.message.BasicLineParser;import org.apache.http.message.LineParser;import org.apache.http.protocol.HttpContext;import org.apache.http.ssl.SSLContexts;import org.apache.http.util.CharArrayBuffer;import sun.net.InetAddressCachePolicy;import javax.net.ssl.SSLContext;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.UnknownHostException;import java.nio.charset.CodingErrorAction;import java.util.Arrays;import java.util.concurrent.TimeUnit;import static java.lang.Thread.*;public class l {        //创建httpClient对象    public static CloseableHttpClient getHttpClient(){        //使用custom message parser / writer来定制HTTP        //消息被解析并写入数据流。.        HttpMessageParserFactory responseParserFactory = new DefaultHttpResponseParserFactory() {            @Override            public HttpMessageParser create(                    SessionInputBuffer buffer, MessageConstraints constraints) {                LineParser lineParser = new BasicLineParser() {                    @Override                    public Header parseHeader(final CharArrayBuffer buffer) {                        try {                            return super.parseHeader(buffer);                        } catch (ParseException ex) {                            return new BasicHeader(buffer.toString(), null);                        }                    }                };                return new DefaultHttpResponseParser(                        buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) {                    @Override                    protected boolean reject(final CharArrayBuffer line, int count) {                            //尝试无限忽略状态行前面的所有垃圾                        return false;                    }                };            }        };        HttpMessageWriterFactory requestWriterFactory = new DefaultHttpRequestWriterFactory();        //使用自定义连接工厂来自定义过程        //初始化传出的HTTP连接。除了标准的连接HTTP连接工厂可以定义消息        //用于单个连接的解析器/写入器例程        HttpConnectionFactory connFactory = new ManagedHttpClientConnectionFactory(                requestWriterFactory, responseParserFactory);        //客户端HTTP连接对象在完全初始化时可以绑定到        //一个任意的网络socket。网络套接字初始化的过程,        //它与远程地址的连接和与本地地址的绑定是受控制的        //通过连接socket工厂。        //安全连接的SSL上下文可以基于        //系统或应用程序特定的属性。        SSLContext sslcontext = SSLContexts.createSystemDefault();        // 为所支持的自定义连接套接字工厂创建一个注册        // protocol schemes.        Registry socketFactoryRegistry = RegistryBuilder.create()                .register("http", PlainConnectionSocketFactory.INSTANCE)                .register("https", new SSLConnectionSocketFactory(sslcontext))                .build();        // 使用自定义DNS解析器覆盖系统DNS解析。        DnsResolver dnsResolver = new SystemDefaultDnsResolver() {            @Override            public InetAddress[] resolve(final String host) throws UnknownHostException {                if (host.equalsIgnoreCase("myhost")) {                    return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };                } else {                    return super.resolve(host);                }            }        };        // 使用自定义配置创建连接管理器。        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(                socketFactoryRegistry, connFactory, dnsResolver);        // 创建套接字配置        SocketConfig socketConfig = SocketConfig.custom()                .setTcpNoDelay(true)                .build();        //将连接管理器配置为使用socket配置        //默认或为特定的主机。        connManager.setDefaultSocketConfig(socketConfig);        //connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);        // Validate connections after 1 sec of inactivity        connManager.setValidateAfterInactivity(1000);        // 创建消息的约束        MessageConstraints messageConstraints = MessageConstraints.custom()                .setMaxHeaderCount(200)                .setMaxLineLength(2000)                .build();        // 创建连接配置        ConnectionConfig connectionConfig = ConnectionConfig.custom()                .setMalformedInputAction(CodingErrorAction.IGNORE)                .setUnmappableInputAction(CodingErrorAction.IGNORE)                .setCharset(Consts.UTF_8)                .setMessageConstraints(messageConstraints)                .build();        //配置连接管理器来使用连接配置        //默认或为特定的主机。        connManager.setDefaultConnectionConfig(connectionConfig);        //connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT);        //为持久连接配置总最大或每个路由限制        //连接管理器可以在连接池中保存或租用。        connManager.setMaxTotal(100);        connManager.setDefaultMaxPerRoute(10);        //connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);        // 如有必要,使用自定义cookie存储。        CookieStore cookieStore = new BasicCookieStore();        // 如有必要,使用自定义证书提供程序。        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();        // 创建全局请求配置        RequestConfig defaultRequestConfig = RequestConfig.custom()                .setCookieSpec(CookieSpecs.DEFAULT)                .setExpectContinueEnabled(true)                .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))                .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))                .build();        // 使用给定的自定义依赖项和配置创建HttpClient。.        CloseableHttpClient httpClient = HttpClients.custom()                .setConnectionManager(connManager)                .setDefaultCookieStore(cookieStore)                .setDefaultCredentialsProvider(credentialsProvider)        //.setProxy(new HttpHost("myproxy", 8080))                .setDefaultRequestConfig(defaultRequestConfig)                .build();        return httpClient;    }    /**     * 模拟发送url Get 请求     *     * @param url     * @return     */    public static String requestGetUrl(String url) {        CloseableHttpClient httpClient = HttpClients.createDefault();        StringBuilder entityStringBuilder = null;        try {            HttpGet get = new HttpGet(url);            CloseableHttpResponse httpResponse = null;            httpResponse = httpClient.execute(get);            try {                HttpEntity entity = httpResponse.getEntity();                entityStringBuilder = new StringBuilder();                if (null != entity) {                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"), 8 * 1024);                    String line = null;                    while ((line = bufferedReader.readLine()) != null) {                        entityStringBuilder.append(line + "/n");                    }                }            } finally {                httpResponse.close();            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (httpClient != null) {                    httpClient.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }        return entityStringBuilder.toString();    }        //执行post请求    public static String requestPostUrl(String url, String param, String token) throws Exception {        InputStream is = null;        String body = null;        StringBuilder res = new StringBuilder();        HttpPost httpPost = new HttpPost(url);        httpPost.addHeader("Authorization", "Token " + token);        httpPost.addHeader("Content-Type", "application/json");        StringEntity stringEntity = new StringEntity(param, "utf-8");        stringEntity.setContentEncoding("UTF-8");        stringEntity.setContentType("application/json");        // post.setHeaders(headers);         //代headers请求        httpPost.setEntity(stringEntity);        RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).build();        httpPost.setConfig(config);        CloseableHttpClient httpClient = getHttpClient();        // HttpClients.createDefault();        CloseableHttpResponse response = httpClient.execute(httpPost);        HttpEntity entity = response.getEntity();        if (entity != null) {            is = entity.getContent();        //转换为字节输入流            BufferedReader br = new BufferedReader(new InputStreamReader(is, Consts.UTF_8));            while ((body = br.readLine()) != null) {                res.append(body);            }        }        System.out.println(res.toString());        //Object jsonMap = JSON.parse(res.toString());        return res.toString();    }    public static void main(String[] args) throws UnknownHostException, InterruptedException {        try {            String result1 = requestGetUrl("http:        //example.com:8090/index/2/");            System.out.println(result1);            String result2 = requestPostUrl("http:        //example.com:8090/index/2/","wonhero","d-a613-b1b1ae807064");            System.out.println(result2);        } catch (Exception e) {            e.printStackTrace();        }    }}