学习HttpClient 的第一个例子,可以成功获取到网页内容
POM.xml
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HelloWorld {
public static void main(String[] args) throws Exception {
//创建httpClient实例
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建httpget实例
HttpGet httpGet = new HttpGet("http://www.qq.com/");
CloseableHttpResponse response=null;
//执行http get请求
response=httpclient.execute(httpGet);
获取返回实体
HttpEntity entity = response.getEntity();
System.out.println("网页内容:"+ EntityUtils.toString(entity,"utf-8"));
response.close();//response 关闭
httpclient.close();//httpClient 关闭
}
}
-----------------------------以下是官方文档说明
准备好
您需要做的第一件事是获取HttpClient及其 依赖项的副本。本教程是针对HttpClient 3.0 编写的。您还需要JDK 1.3或更高版本。
一旦您下载了HttpClient和依赖关系,您将需要将它们放在您的类路径上。对于HTTPS连接,JSSE还有一个可选的依赖关系; 这不是本教程所必需的。
概念
使用HttpClient的一般过程包括若干步骤:
- 创建一个实例
HttpClient
。 - 创建一个方法的实例(在这种情况下为GetMethod)。要连接的URL被传递给方法构造函数。
- 告诉
HttpClient
执行该方法。 - 阅读回应。
- 释放连接。
- 处理响应。
我们将介绍如何执行以下每个步骤。请注意,无论服务器是否返回错误,我们都会执行整个过程。这很重要,因为HTTP 1.1允许多个请求通过简单地一个接一个地发送请求来使用相同的连接。显然,如果我们没有读取对第一个请求的整个响应,剩下的数据就会阻碍第二个响应。 HttpClient尝试处理这个但是为了避免问题,始终释放连接很重要。
在连接释放后,HttpClient将尽力确保连接可重用。
实例化HttpClient
无参数构造函数为HttpClient
大多数情况提供了一套很好的默认值,这就是我们将要使用的。
//创建httpClient实例
CloseableHttpClient httpclient = HttpClients.createDefault();
创建方法
HTTP规范定义的各种方法对应于实现HttpMethod接口的HttpClient中的各种类。这些类都在包中找到 org.apache.commons.httpclient.methods
。
我们将使用Get方法,这是一个简单的方法,只需要一个URL并获取URL指向的文档。
//创建httpget实例
HttpGet httpGet = new HttpGet("http://www.qq.com/");
执行方法
该方法的实际执行是通过调用 executeMethod
客户端并传递方法来执行的。由于网络连接不可靠,因此我们还需要处理发生的任何错误。
有两种类型的异常,可以通过executeMethod被抛出,HttpException
和IOException
。
另一个有用的信息是服务器返回的状态码。该代码由executeMethod作为int返回,可用于确定请求是否成功,有时可以指示客户端需要进一步的操作,例如提供验证凭据。
HttpException
HttpException表示逻辑错误,并且在请求无法发送或由于HTTP规范的致命违反而无法处理响应时抛出。通常这种异常无法从中恢复。有关协议异常的详细讨论,请参考 HttpClient异常处理指南。请注意,HttpException实际上扩展了IOException,因此如果应用程序不区分协议和传输错误,您可以忽略它并捕获IOException。
IOException异常
一个简单的IOException(它不是HttpException的子类)表示一个传输错误,并且当出现可能是一次性I / O问题的错误时抛出。通常,请求在第二次尝试中有很好的成功机会,所以默认情况下,HttpClient将尝试自动恢复请求。有关传输异常的详细讨论,请参考 HttpClient异常处理指南。
方法恢复
默认情况下,HttpClient将自动尝试从非致命错误中恢复,即抛出一个普通的IOException异常。HttpClient将重试该方法三次,前提是该请求从未完全传输到目标服务器。有关HTTP方法恢复的详细讨论,请参考HttpClient异常处理指南
// set per default
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
默认恢复过程可以用自定义恢复过程替换。可以增加自动重试次数。即使请求可能已经被服务器处理并且在接收到响应时发生了I / O异常,也可以指示HttpClient重试该方法。启用自动重试时请小心。仅当方法知道是幂等时才使用它,也就是说,已知可以安全地重试多次,而不会导致数据损坏或数据不一致。
经验法则是GET方法通常是安全的,除非另有说明,除非另有说明,实体封闭方法(如POST和PUT)通常是不安全的。
DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler(10, true);
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);
阅读回应
无论服务器返回的状态如何,响应体总是被读取至关重要。有三种方法可以做到这一点:
- Call
method.getResponseBody()
. 这将返回包含响应正文中的数据的字节数组。 - Call
method.getResponseBodyAsString()
.。这将返回一个包含响应体的String。请注意,尽管使用默认的编码方式,从字节到字符串的转换已经完成,因此该方法可能无法在所有平台上移植。 - Call
method.getResponseBodyAsStream()
并读取流的所有内容,然后调用stream.close()
。如果可以接收大量数据,那么这种方法是最好的,因为它可以缓冲到文件中或在读取时被处理。确保始终读取整个数据,并在流上呼叫close。
对于本教程,我们将使用getResponseBody()
简单。
byte[] responseBody = method.getResponseBody();
释放连接
这是保持事态发展的关键一步。我们必须告诉 HttpClient我们完成了连接,现在可以重用。没有这样做,HttpClient将无限期地等待连接释放,以便可以重用。
method.releaseConnection();
处理Repsonse
我们现在已经完成了与HttpClient的交互,可以专注于做我们需要做的数据。在我们的例子中,我们将它打印出来到控制台。
值得注意的是,如果您将响应作为流检索并在读取时进行处理,则此步骤实际上与读取连接相结合,并且在完成处理所有数据后,您将关闭输入流和释放连接。
注意:我们应该注意这里的字符编码,而不是仅使用系统默认值。
System.out.println(new String(responseBody));
最终源代码
当我们把所有这一切加上一点胶水代码,我们得到下面的程序。
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HelloWorld {
public static void main(String[] args) throws Exception {
//创建httpClient实例
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建httpget实例
HttpGet httpGet = new HttpGet("http://www.qq.com/");
CloseableHttpResponse response=null;
//执行http get请求
response=httpclient.execute(httpGet);
获取返回实体
HttpEntity entity = response.getEntity();
System.out.println("网页内容:"+ EntityUtils.toString(entity,"utf-8"));
response.close();//response 关闭
httpclient.close();//httpClient 关闭
}
}