您的位置:

使用Apache Httpclient进行HTTP网络请求

使用Java进行网络请求时,Apache Httpclient是一个不错的选择。该库提供了完整而丰富的HTTP客户端协议支持。它可以轻松地完成HTTP请求,并支持各种HTTP协议版本的请求。同时,Apache Httpclient也支持HTTP身份验证、代理服务器、Cookie等基础功能。为了方便学习,我们从以下几个方面对Apache Httpclient进行详细阐述。

一、Httpclient的基本使用

使用Apache Httpclient进行网络请求,首先需要创建HttpClient实例,该实例可以被重用。可以通过HttpClientBuilder构造器获取HttpClient对象。
HttpClient httpClient = HttpClientBuilder.create().build();
创建完HttpClient实例后,就可以开始发起HTTP请求了。发起HTTP请求的第一步是创建HttpRequest对象。具体实现根据请求类型的不同而有所不同,可以通过HttpGet或HttpPost方式进行请求。
HttpGet httpGet = new HttpGet("http://www.google.com");
HttpResponse response = httpClient.execute(httpGet);
上述代码是一个最基本的例子,可以发起一个GET请求并获得响应。我们可以将返回的HttpResponse对象用于获取响应的状态码、Header信息和响应体等。

二、请求参数设置

请求参数设置是使用Apache Httpclient进行请求时必不可少的一部分。可以使用HttpUriRequest接口或其子类设置请求参数。 首先,我们可以通过setHeader()方法设置请求头信息。
HttpGet httpGet = new HttpGet("http://www.google.com");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0");
HttpResponse response = httpClient.execute(httpGet);
上述代码中,设置了User-Agent请求头信息。 其次,我们可以使用setEntity()方法设置请求体。
HttpPost httpPost = new HttpPost("https://api.example.com");
StringEntity stringEntity = new StringEntity("Hello, World!", ContentType.APPLICATION_JSON);
httpPost.setEntity(stringEntity);
HttpResponse response = httpClient.execute(httpPost);
上述代码中,设置了POST请求的请求体信息为JSON格式的字符串"Hello, World!"。

三、响应处理

使用Apache Httpclient获得响应后,我们需要进行响应处理。最基本的处理方法是根据请求状态码判断请求是否成功完成。可以通过getStatusLine()方法获取响应状态码。
HttpGet httpGet = new HttpGet("http://www.google.com");
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    //请求成功处理
} else {
    //请求失败处理
}
除了校验状态码以外,我们还可以通过HttpResponse对象获取响应内容。可以使用EntityUtils.toString()方法获取响应体的字符串形式,也可以使用EntityUtils.toByteArray()方法获取响应体的字节数组形式。
HttpGet httpGet = new HttpGet("http://www.google.com");
HttpResponse response = httpClient.execute(httpGet);
String responseBody = EntityUtils.toString(response.getEntity());

四、异常处理

在使用Apache Httpclient进行网络请求时,我们不能保证每次请求都是成功的。因此,我们需要对请求异常进行处理。可以使用HttpRetryException、HttpHostConnectException等异常类来进行具体的异常处理。
try {
    HttpGet httpGet = new HttpGet("http://www.google.com");
    HttpResponse response = httpClient.execute(httpGet);
} catch (HttpHostConnectException e) {
    //处理连接失败异常
} catch (HttpRetryException e) {
    //处理请求重试异常
}

五、高级使用

在使用Apache Httpclient时,我们还可以使用连接池技术、异步请求等高级功能,以提升程序性能和用户体验。 连接池技术可以降低资源消耗,并且加快请求的响应时间。可以使用PoolingHttpClientConnectionManager类的对象来进行连接池的管理。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(20);
HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(cm).build();
上述代码创建了一个连接池管理对象,并为最大连接数设定了200,同时设置每个路由器对应的默认最大连接数为20。 异步请求可以防止阻塞主线程,以保证用户交互过程的流畅性。异步请求可以使用FutureCallback接口来进行处理。
Future future = httpClient.execute(request, 
   new FutureCallback
    () {
    @Override
    public void completed(HttpResponse response) {
        //请求成功处理
    }

    @Override
    public void failed(Exception ex) {
        //请求失败处理
    }

    @Override
    public void cancelled() {
        //请求取消处理
    }
}
    );

  
上述代码中,使用execute()方法发起异步请求,FutureCallback接口可以用于处理异步请求操作的成功、失败和取消等情况。

六、总结

本文对Apache Httpclient进行了详细介绍,从基本使用、请求参数设置、响应处理、异常处理等方面进行了阐述。同时,我们还提及了高级使用中的连接池技术和异步请求等内容,以便读者更好地掌握Apache Httpclient的使用。