虽然在 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请求为例。
HttpMethod method = new GetMethod("http://www.google.cn");
client.getHostConfiguration().setHost("www.imobile.com.cn",
80
,
"
http
"
);
…… HttpMethod method = new GetMethod( " /simcard.php?simcard=1330227 " );
method.addRequestHeader(
"
Range
"
,
"
bytes=500-
"
);
int statusCode = client.executeMethod(method);
接上例。 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);
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 |
HttpClient主要功能
最新推荐文章于 2024-09-11 16:05:08 发布