博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apache HttpClient 3.X使用手册
阅读量:4039 次
发布时间:2019-05-24

本文共 4357 字,大约阅读时间需要 14 分钟。

原文地址   http://hc.apache.org/httpclient-3.x/tutorial.html

简介:

这份使用手册是用来说明怎样使用HttpClient的。当你阅读完这份说明的时候,你可以写一个用HttpClient来下载页面的简单应用程序。假如你明白怎么用java开发和熟悉你正在开发的环境的话。

准备:

你需要做的第一件事情是获取一份HttpClient和它的依赖。这份使用手册是为HttpClient 3.0写的。 你的JDK版本必须是1.3 或者是以上的才可以。一旦你下载了HttpClient和它的依赖之后,把它们放到你的类路径上。在JSSE上还有一个可选的依赖,它对HTTPS是必需的,但在本使用手册中不是必要的。

概念:

使用HttpClient的主要流程包含以下几个步骤:

1.创建HttpClient的一个实例

2.创建一个方法的实例(GetMethod在此引用)。要连接的URL是作为参数传递给方法构造器

3.调用HttpClient来执行方法

4.读取response

5.释放连接

6.处理response

接下来我们将讲解怎么操作这些步骤。注意:我们将贯穿处理整个流程,无论服务器返回的response是正确的还是错误的。这个非常重要,因为HTTP1.1允许多个请求通过一个接一个的发送来共享一个连接。显而易见的,如果我们不读取第一个请求的完整的response,按照同样的规则接下来的数据是第二个response的。HttpClient试图处理它并绕过各种难题。释放连接就相当的重要了。

基于连接的释放,HttpClient将尽力保证连接是可以重用的。

无论服务器返回的是错误还是正确,释放连接是非常重要的。

实例化HttpClient

HttpClient的无参构造方法为大多数方案提供了一系列很好的默认设置,这也是我们将要使用的。

HttpClient client=new HttpClient();

创建一个方法

HttpClient遵循HTTP规范针对不同类型实现了HttpMethod接口定义的对应的各种方法。这些类型可以在包 org.apache.commons.httpclient.methods 下面找到。

我们将使用一个是带有一个URL的简单的Get方法并获取URL指向的文档。

HttpMethod method=new GetMethod("http://www.apache.org/");
执行方法

方法的实际执行是在客户端上通过调用方法的executeMthod并传递在方法中执行。由于网络连接不稳定,我们也需要处理发生的所有错误。有两种异常会被executeMethod抛出,HttpException和IOException。其他有用的信息片段是从服务器上返回的状态码。这个状态码是被executeMethod作为int返回的,还可以用作判断请求是否成功并提示客户端接下来的必须操作,例如提供授权证书。

HttpException

一个HttpException表示一个逻辑错误并且当请求无法发送或者response因为违反HTTP规范无法被处理的时候抛出。通常这种异常无法被修复。对这种协议上异常的详细讨论可以参考这个链接:.

IOException

一个单纯的IOException(它不是HttpException的子集)表示一个传输错误并在当一个错误发生在类似一个一瞬间断掉的I/O问题是被抛出。通常一个请求可以在第二次请求的时候处理成功,所以每个默认的HttpClient会自动修复这种请求。对传输异常上的详细讨论可以参考这个链接:.

方法修复

每个默认的HttpClient将会自动尝试修复非协议错误,例如当一个单纯的IOException被抛出时。HttpClient将尝试提供三次机会运行没有被目标服务器完整处理请求的方法。对HTTP方法修复的详细讨论可以参考这个链接:

//set per defaultclient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());
默认的修复程序可以被用户自定义替换掉。尝试次数也可以增加HttpClient可以被设定重试方法,即便这个方法已经被服务器处理并且在接收response的时候发生了IOExectpion. 当启动自动尝试的时候请谨慎处理。只有当方法已经确定为幂等的时候才可以使用它,因为,这样可以保证多次的尝试不会引起数据混乱和数据不连续。

根据规则,GET通常是是安全的,其他的像POST和PUT是不安全的。

DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler(10, true);client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);

读取response

无论从服务器返回的状态是什么,response的内容一直是被读取的,这个至关重要。有三种方法处理它:

1.调用method.getResponseBody(),它将返回一个包含返回信息的byte数组。

2.调用method.getResponseBodyAsStrng(),它将返回一个包含返回信息的字符串。值得警告的是从byte到String的转换使用的是默认的字符编码,所以这个方法在跨平台的时候并不是很方便。

3.调用method.getResponseBodyAsStream(),它将读取整个内容的流,然后调用stream.close()。这个方法是最好的,特别是接收的数据量很大,它可以缓存到一个文件或者一边处理一边读取。一定要保证读取全部的信息并且关闭流。

在这份使用手册中,我们为了简便,使用getResponseBody() 。

byte[] responseBody = method.getResponseBody();

释放连接

为了保证流程的顺畅,这一步是非常苛刻的一步。我们必须告诉HttpClient我们已经使用连接完毕并且它现在可以重用了。不处理它,这个HttpClient将一直等待连接释放的信号来确保它可以被重用。

method.releaseConnection();
处理Response

现在我们已经处理完了与HttpClient的交互并可以全神贯注的处理对数据的操作了。在这里,我们仅仅只是在控制台上打印它。值得注意的是假设你正在以流的方式接收response并且同时边读取边处理,这一步实际上会结合读取连接, 同时当你处理完所有数据的时候,你需要关闭输入流并释放连接。

注意:我们应该设定字符编码,而不是使用默认的字符编码。

System.out.println(new String(responseBody));

最终的源码:

当我们把上面的整理在一起的时候,我们得到了下面的:

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();    }    }}

转载地址:http://depdi.baihongyu.com/

你可能感兴趣的文章
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
flex中设置Label标签文字的自动换行
查看>>
Flex 中的元数据标签
查看>>
flex4 中创建自定义弹出窗口
查看>>
01Java基础语法-11. 数据类型之间的转换
查看>>
01Java基础语法-13. if分支语句的灵活使用
查看>>
01Java基础语法-15.for循环结构
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-17. do..while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>