参考http://www.ibm.com/developerworks/cn/opensource/os-httpclient/,以备个人学习所用
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HttpClient 提供的主要的功能:
- 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持自动转向
- 支持 HTTPS 协议
- 支持代理服务器等
HttpClient 基本功能的使用
GET 方法
使用 HttpClient 需要以下 6 个步骤:
1. 创建 HttpClient 的实例
HttpClient httpClient = new HttpClient();
2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
GetMethod getMethod = new GetMethod("http://www.tom.com/");
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode ==HttpStatus.SC_OK) 则说明成功了
4. 读 response
byte[] responseBody = method.getResponseBody();
String responseBody = method.getResponseBodyAsString();
5. 释放连接。无论执行方法是否成功,都必须释放连接
method.releaseConnection();
6. 对得到后的内容进行处理
POST方法
根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能:
- 对现有资源的注释(Annotation of existing resources)
- 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息
- 提交数据块,如将表单的结果提交给数据处理过程
- 通过附加操作来扩展数据库
调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。
注意:
(1)表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值
(2)将表单所有的值设置到PostMethod中用方法setRequestBody
(3)HttpClient对于要求接受后继服务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理
(4)301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。
String url = "http://www.abc.com";
PostMethod postMethod = new PostMethod(url);
NameValuePair[] data = { new NameValuePair("id", "youUserName"),
new NameValuePair("passwd", "yourPwd") };
postMethod.setRequestBody(data);
int statusCode = httpClient.executeMethod(postMethod);
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向的地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
System.out.println("The page was redirected to:" + location);
} else {
System.err.println("Location field value is null.");
}
return;
}