HttpClient主要功能

虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。HttpClient 项目非常活跃,使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。

HttpClient的主要功能有以下一些:

1)    实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等);
2)    支持自动转向;
3)    支持 HTTPS 协议;
4)    支持代理服务器等。


3.1 环境搭建及所需包

    需要Java开发环境JDK,需要可以访问网络。Android程序需要有“android.permission.INTERNET”的permission。

所需包:

1、commons-httpclient-3.1.jar: 包括Http协议所需的类。
2、commons-logging-1.1.jar: 包括记录程序运行时的活动日志记录的类。
3、commons-codec-1.3.jar: 包括编码解码的类。

这些包都是Apache的开源项目,可以在Apache开源组织官网http://www.apache.org/上找到。


3.2 HttpClient实现HTTP协议基本通信操作

在实现所有操作之前必须首先实例化一个HttpClient,即初始化一个客户端。

HttpClient client  =   new  HttpClient();

3.2.1 请求

   
以GET请求为例。


    a、实例化一个请求方法。

HttpMethod method = new GetMethod("http://www.google.cn");


注:

①    虽然Google已经将服务器搬出了大陆,但是HttpClient可实现自动转向,即自动重定向。所以当服务器返回的状态代码为3××时,将自动重定向,知道到达文件实际位置)。

②    GetMethod构造函数中的字符串表示的是文件的URI地址。这里只是因为之前没有指定服务器主机地址,所以需要完整名。其实也可以这样:

client.getHostConfiguration().setHost("www.imobile.com.cn",  80 " http " );

    ……

HttpMethod method 
=   new  GetMethod( " /simcard.php?simcard=1330227 " );


b、添加需要的消息报头信息。

method.addRequestHeader( " Range " " bytes=500- " );


HttpClient会构建必须的消息报头信息,如果没有特殊要求可以不用修改。但如果需要在消息报头添加一些特殊信息,例如下载时需要断点续传等,则可用上述方法修改。

c、发出请求(执行命令)。

int statusCode = client.executeMethod(method);


此时,程序实际向服务器发出请求,连接成功后,函数返回,返回值为状态代码。

3.2.2 响应

    接上例。

a、返回状态代码。

上例中的“statusCode”即为状态代码。除此方法之外,还可以:

int  statusCode  =  method.getStatusCode();

注:在httpclient的包中有一个名为“HttpStatus”类,其中定义了大多数的状态代码。如:

HttpStatus.SC_OK
HttpStatus.SC_FORBIDDEN 等。

b、响应报头。

Header[] headers  =  method.getResponseHeaders();

获取所有服务器端返回的响应报头。

Header header  =  method.getRequestHeader( " Content-Type " );

获取响应报头中指定的键值对。

之后可以通过调用header.getName()、header.getValue()来得到相关信息。

c、响应正文。

byte [] bytes  =  method.getResponseBody();

InputStream inputStream  =  method.getResponseBodyAsStream(); 

String string  =  method.getResponseBodyAsString(); 

以上三种方法,视情况选用。

3.2.3 断开连接

method.releaseConnection();

断开连接。


     3.2.4 其他

其他包括一些和下载无关,但却非常基本和有用的东西

a、POST数据。

POST请求和GET请求大致相同,唯一需要注意的是,如何在POST信息中加入自己所需传输的信息。

postMethod.setRequestBody(InputStream body);

postMethod.setRequestBody(NameValuePair[] parameterBody);

postMethod.setRequestBody(String body);


b、代理服务器。

只需指定httpClient的实例的代理就可以了,基于此实例的所有操作将经由此代理。
httpClient.getHostConfiguration().setProxy(hostName,port);

c、字符编码。

某目标页的编码可能出现在两个地方:

第一个地方是服务器返回的http头中(RequestHeader的Content-Type、Content-Encoding字段);

另外一个地方是得到的html/xml页面中。如:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
或者 <?xml version="1.0" encoding="gb2312"?>

d、自动跳转。

HttpClient对GET请求可实现自动跳转。但是对于POST和PUT请求要求接受后继服务的,暂不支持自动跳转。

当服务器返回的状态代码为3××时,需要根据消息报头的“Location”字段的地址来实现跳转。注意,“Location”字段的地址可能是相对地址,需要自己进行处理。

还有一种可能就是在页面中实现的跳转。例如,在HTML中,<meta http-equiv="refresh" content="5; url=http://www.ibm.com/us">。

e、Https协议。

参看: 《HttpClient入门》


参考文献

本文中自己的东西并不多,大多数都是来自网上的一些资料的摘抄、引用和总结。主要的文献资料有以下一些,感谢这些文章的作者共享其资料。

1、 《HTTP协议(收藏)》
2、 《文件下载原理详解1 http协议》
3、 《HttpClient入门》
4、 《HttpClient入门教程》


转载请注明出处:http://www.blogjava.net/zh-weir/archive/2010/05/02/319892.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值