1、HttpClient的pom.xml配置(maven依赖)
org.apache.httpcomponents
httpclient
4.5.6
2、使用PoolingHttpClientConnectionManager创建HttpClient
//使用custom message parser / writer来定制HTTP //消息被解析并写入数据流。. HttpMessageParserFactoryresponseParserFactory = 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 //消息被解析并写入数据流。. HttpMessageParserFactoryresponseParserFactory = 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(); } }}