锁定老帖子 主题:HttpClient简单应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-09
最后修改:2009-04-17
HttpCient简单应用 综述
此指南的设计用来来提供一个怎么样去使用HttpClient的基本概况。如果完成此指南的阅读应该能够使用下载页面的HttpClient开发一个简单的应用了。
准备
第一件事情是你需要有一个HttpClient以及其附件。此指南适用于HttpClient3.0。所以你必须要有JDK1.3或是更高版本的JDK。
下载HttpClient及其附件并把他们设置到你的CLASSPATH环境里。
概念
一般使用HttpClient包含以下几个步骤: · 创建一个HttpClient实例 · 创建一个方法的实例(比如GetMethod),在方法的构造方法里可以传入你要去连接的URL。 · 告诉HttpClient去执行方法。 · 读取返回的Response。 · 释放连接。 · 处理Response。 下面我将会解释如何去执行每一步。需要注意的是我们这里假定服务器总是放回正确的结果。这一点很重要,因为HTTP 1.1 允许重复的请求去使用相同的连接,只需要简单的一个接一个的发送请求。显然,如果我们不去读取第一次请求的Response,它的数据在第二次处理请求的时候被读出来。HttpClient提供了此解决方案,为了避免这个问题,释放连接就显的相当重要了。一但释放HttpClient,connection也将是可重用的。
实例化HttpClient
这里无参构造方法为大多数的情况提供了一个默认的、良好的配置。
HttpCient client = new HttpClient();
创建一个方法
在HttpClient里,符合HTTP协议的各种Methods相对应的class类都实现了HttpMethod这个接口,这些类都放到了org..apache.commons.httpclient.methods这个包下面。
下面这段代码通过Get方法简单的通过URL得到该URL指向的文件。 HttpMethod method = new GetMethod(”Http://www.apache.org/”);
执行方法
调用client.executeMethod(method)就可以执行方法,网络不稳定的情况下,我们也要对错误进行处理。executeMethod可能抛出HttpException和IOException异常。
另外一些有用的信息就是从服务器返回的状态码。状态码在执行executeMethod方法时以int基本类型返回,通过状态码我们可以判断请求是否成功,或是需要client进一步进行处理,像身份验证。
HttpException和IOException
一个HttpException对应一个逻辑错误,当Request不能够被发送或是Response不能够按照HTTP协议来解析的时候抛出,通常这种错误不能够恢复。这里是对HttpClient 的异常处理的详细讨论。请注意,HttpException继承了IOException,若你的应用不需要区分协议和传输错误时,你可以忽略HttpException或是简单的捕获IOException。
Method的自恢复
每个默认的HttpClient都会自动尝试从不是致命的错误中恢复,当一个建档IOException抛出时,HttpClient重复3次直到将Requset的全部内容发送到目标服务器。你可以通过以下代码来设置恢复机制。 Client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
你也可以自己定制恢复机制,重复的次数也可以替换。
读取Response
通常在忽略服务器返回的状态码的情况下,读取Response body,这一点很重要。有三种方法可以做到:
· 调用method.getResponseBody()。可返回被包含在Resonse body中的byte数据。 · 调用method.getResposneBodyAsString()。此方法将返回包含在Response body中的String,这里需要注意的是bytes专程String是使用的默认编码,所以此方法并能够在所以的平台上正确执行。 · 调用method.getResponseBodyAsStream()。当再次调用stream.close()时会返回包含完整内容的流。此方法适用于对接受大量数据,可将数据缓存到一个文件中或是处理。
释放连接
这是关键的一个步骤。我们必须告诉HttpClient我们已经做完所有的工作,这样HttpClient才可以被重用,如果不释放连接HttpClient会无限期的等待直接关闭连接。 Method.releaseConnection()。
处理Response
这里我只是简单的把Response中的内容打印处理 System.out.println(new String(responseBody)); 处理Resposne时候可以根据你的具体应用来做相应的处理。
最后是源代码
import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.*; import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
public class HttpClientTutorial {
private static String url = "http://www.apache.org/";
public static void main(String[] args) { // Create an instance of HttpClient. HttpClient client = new HttpClient();
// Create a method instance. GetMethod method = new GetMethod(url);
// Provide custom retry handler is necessary method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
try { // Execute the method. int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + method.getStatusLine()); }
// Read the response body. byte[] responseBody = method.getResponseBody();
// Deal with the response. // Use caution: ensure correct character encoding and is not binary data System.out.println(new String(responseBody));
} catch (HttpException e) { System.err.println("Fatal protocol violation: " + e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println("Fatal transport error: " + e.getMessage()); e.printStackTrace(); } finally { // Release the connection. method.releaseConnection(); } } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4761 次