httpclient是Apache的HttpClient项目提供的一个Java HTTP客户端库,它主要用于将Java程序作为HTTP客户端与HTTP服务器进行通信。httpclient支持Http协议的各个版本,并且可以通过配置快速自定义网络请求的各种属性,例如连接超时、HTTP代理等。
httpclient的优点
httpclient相对于Java自带的URLConnection,它具有很多的优点。
首先,httpclient内部采用连接池来管理网络连接,请求者可以通过获取连接池里面的资源快速复用以前的连接,由此来减少因为TCP连接和SSL握手等开销所造成的性能损耗。
其次,httpclient可以支持http协议之外的协议,如HTTPS、FTP等,且可以快速灵活的进行网络请求的属性配置,同时支持连接超时、连接重试、连接代理等功能。
另外,httpclient使用Java NIO方式进行网络IO操作,相比较Java自带的URLConnection更加轻便灵活,而且代码可读性也很高。
httpclient的使用方法
对于httpclient的使用,可以分为三步:创建HTTP客户端实例,构建HTTP请求,处理HTTP响应数据。
- 创建HTTP客户端实例
- 构建HTTP请求
- 处理HTTP响应数据
在使用httpclient发起网络请求之前,需要创建httpClient实例,httpClient可以被认为是一个全局的网络连接池,它可以重用已有的连接,同时也可以配置一些连接池中连接的属性。
创建httpclient实例的方式如下:
CloseableHttpClient httpClient = HttpClients.createDefault();
httpclient支持多种HTTP请求,包括GET、POST、PUT、DELETE等。这里以GET请求为例,构建httpGet实例,然后配置一些请求参数,比如请求头信息、请求参数等。
构建httpGet实例的方式如下:
HttpGet httpGet = new HttpGet(\"http://www.example.com\");
然后可以为httpGet实例设置请求头信息:
httpGet.setHeader(\"Content-type\", \"text/html;charset=utf-8\");
可以通过创建httpclient实例之后,调用execute()方法发送HTTP请求,然后将HTTP响应的结果解析为需要的数据格式,例如字符串、文件等。这里以解析为字符串为例。
发送httpGet请求并获取HTTP响应数据的代码如下:
CloseableHttpResponse response = httpClient.execute(httpGet);
从响应中解析字符串的方式如下:
String result = EntityUtils.toString(response.getEntity());
httpclient的进阶使用
httpclient支持更多进阶功能,例如连接池的调优配置、过滤器的自定义、HTTPS的支持、对一些异常情况的处理、请求和响应的拦截等。
连接池的调优配置
httpclient连接池的默认大小可以通过在创建httpClient实例的时候传入HttpClientBuilder来配置,该连接池的连接超时时间、最大连接数、每个路由最大连接数等也可以在此进行配置。
HttpClientBuilder httpClientBuilder = HttpClients.custom();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(200);//最大连接数
connManager.setDefaultMaxPerRoute(20);//每个路由的最大连接数
httpClientBuilder.setConnectionManager(connManager);
CloseableHttpClient httpClient = httpClientBuilder.build();
过滤器的自定义
httpclient的过滤器可以自定义,主要有PreProcessRequestHandler、ResponseHandler、HttpException、HttpExceptionRetry、HttpRequestInterceptor、HttpResponseInterceptor等这些接口。
与Java非常类似,httpClient也是通过实现这些接口来增强HTTP请求响应处理的灵活性。例如,可以通过HttpRequestInterceptor和HttpResponseInterceptor对HTTP请求和响应头信息进行特殊处理。
HTTPS的支持
可以为httpclient配置SSLContext对象,以支持HTTPS,具体代码如下:
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
httpClientBuilder.setSSLSocketFactory(sslsf);
对一些异常情况的处理
httpclient可以自定义异常处理程序,以便在发生错误时进行处理。
例如,可以在使用httpclient的时候通过设置RequestConfig来配置超时时间,并对连接超时或者读取超时等异常进行处理。
请求和响应的拦截
可以为httpclient配置http请求拦截器和http响应拦截器,这样,可以在拦截器中对请求和响应数据进行修改或者增加一些特别的处理逻辑。
拦截器主要通过实现HttpRequestInterceptor和HttpResponseInterceptor来实现。
总结
httpclient作为Apache的完全开源的Java HTTP客户端库,在Java网络开发中起到了不可替代的作用。它不仅仅支持常见的HTTP协议,还支持常见的网络模型和多种高级配置。我们需要了解并掌握httpclient,在网络开发中应用它的优越性,以提高开发的效率。