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

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

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

2、使用PoolingHttpClientConnectionManager创建HttpClient

        //使用custom message parser / writer来定制HTTP
        //消息被解析并写入数据流。.
        HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
            @Override
            public HttpMessageParser<HttpResponse> 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<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
        //使用自定义连接工厂来自定义过程
        //初始化传出的HTTP连接。除了标准的连接HTTP连接工厂可以定义消息
        //用于单个连接的解析器/写入器例程
        HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
                requestWriterFactory, responseParserFactory);
        //客户端HTTP连接对象在完全初始化时可以绑定到
        //一个任意的网络socket。网络套接字初始化的过程,
        //它与远程地址的连接和与本地地址的绑定是受控制的
        //通过连接socket工厂。
        //安全连接的SSL上下文可以基于
        //系统或应用程序特定的属性。
        SSLContext sslcontext = SSLContexts.createSystemDefault();
        // 为所支持的自定义连接套接字工厂创建一个注册
        // protocol schemes.
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>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<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
            @Override
            public HttpMessageParser<HttpResponse> 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<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
        //使用自定义连接工厂来自定义过程
        //初始化传出的HTTP连接。除了标准的连接HTTP连接工厂可以定义消息
        //用于单个连接的解析器/写入器例程
        HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
                requestWriterFactory, responseParserFactory);
        //客户端HTTP连接对象在完全初始化时可以绑定到
        //一个任意的网络socket。网络套接字初始化的过程,
        //它与远程地址的连接和与本地地址的绑定是受控制的
        //通过连接socket工厂。
        //安全连接的SSL上下文可以基于
        //系统或应用程序特定的属性。
        SSLContext sslcontext = SSLContexts.createSystemDefault();
        // 为所支持的自定义连接套接字工厂创建一个注册
        // protocol schemes.
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>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/","cjavapy","d-a613-b1b1ae807064");
            System.out.println(result2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

推荐文档

相关文档

大家感兴趣的内容

随机列表