HttpClient介绍
HTTP 协议可能是现在 Internet 上使用得最多、最重要
![](/icons/6651de.gif)
协议了
![](/icons/6651dou.gif)
越来越多
![](/icons/6651de.gif)
Java 应用
![](/icons/6651chengxu.gif)
需要直接通过 HTTP 协议来访问网络资源
![](/icons/6651dou2.gif)
虽然在 JDK
![](/icons/6651de.gif)
java.net 包中已经提供了访问 HTTP 协议
![](/icons/6651de.gif)
基本功能
![](/icons/6651dou.gif)
但是对于大部分应用
![](/icons/6651chengxu.gif)
来说
![](/icons/6651dou.gif)
JDK 库本身提供
![](/icons/6651de.gif)
功能还不够丰富和灵活
![](/icons/6651dou2.gif)
HttpClient 是 Apache Jakarta Common 下
![](/icons/6651de.gif)
子项目
![](/icons/6651dou.gif)
用来提供高效
![](/icons/6651de.gif)
、最新
![](/icons/6651de.gif)
、功能丰富
![](/icons/6651de.gif)
支持 HTTP 协议
![](/icons/6651de.gif)
客户端编程工具包
![](/icons/6651dou.gif)
并且它支持 HTTP 协议最新
![](/icons/6651de.gif)
版本和建议
![](/icons/6651dou2.gif)
HttpClient 已经应用在很多
![](/icons/6651de.gif)
项目中
![](/icons/6651dou.gif)
比如 Apache Jakarta 上很著名
![](/icons/6651de.gif)
另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient
![](/icons/6651dou.gif)
更多使用 HttpClient
![](/icons/6651de.gif)
应用可以参见http://wiki.apache.org/jakarta-httpclient/HttpClientPowered
![](/icons/6651dou2.gif)
HttpClient 项目非常活跃
![](/icons/6651dou.gif)
使用
![](/icons/6651de.gif)
人还是非常多
![](/icons/6651de.gif)
![](/icons/6651dou2.gif)
目前 HttpClient 版本是在 2005.10.11 发布
![](/icons/6651de.gif)
3.0 RC4
![](/icons/6651dou2.gif)
HttpClient 功能介绍
以下列出
![](/icons/6651de.gif)
是 HttpClient 提供
![](/icons/6651de.gif)
主要
![](/icons/6651de.gif)
功能
![](/icons/6651dou.gif)
要知道更多详细
![](/icons/6651de.gif)
功能可以参见 HttpClient
![](/icons/6651de.gif)
主页
![](/icons/6651dou2.gif)
实现了所有 HTTP
![](/icons/6651de.gif)
思路方法(GET,POST,PUT,HEAD 等)
支持自动转向
支持 HTTPS 协议
支持代理服务器等
下面将逐
![](/icons/6651yi.gif)
介绍怎样使用这些功能
![](/icons/6651dou2.gif)
首先
![](/icons/6651dou.gif)
我们必须安装好 HttpClient
![](/icons/6651dou2.gif)
HttpClient 可以在http://jakarta.apache.org/commons/httpclient/downloads.html下载
HttpClient 用到了 Apache Jakarta common 下
![](/icons/6651de.gif)
子项目 logging
![](/icons/6651dou.gif)
你可以从这个地址http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi下载到 common logging
![](/icons/6651dou.gif)
从下载后
![](/icons/6651de.gif)
压缩包中取出 commons-logging.jar 加到 CLASSPATH 中
HttpClient 用到了 Apache Jakarta common 下
![](/icons/6651de.gif)
子项目 codec
![](/icons/6651dou.gif)
你可以从这个地址http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi 下载到最新
![](/icons/6651de.gif)
common codec
![](/icons/6651dou.gif)
从下载后
![](/icons/6651de.gif)
压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中
HttpClient 基本功能
![](/icons/6651de.gif)
使用
GET 思路方法
使用 HttpClient 需要以下 6 个步骤:
1. 创建 HttpClient
![](/icons/6651de.gif)
例子
2. 创建某种连接思路方法
![](/icons/6651de.gif)
例子
![](/icons/6651dou.gif)
在这里是 GetMethod
![](/icons/6651dou2.gif)
在 GetMethod
![](/icons/6651de.gif)
构造
![](/icons/6651hanshu.gif)
中传入待连接
![](/icons/6651de.gif)
地址
3.
![](/icons/6651diaoyong.gif)
第
![](/icons/6651yi.gif)
步中创建好
![](/icons/6651de.gif)
例子
![](/icons/6651de.gif)
execute 思路方法来执行第 2步中创建好
![](/icons/6651de.gif)
method 例子
4. 读 response
5. 释放连接
![](/icons/6651dou2.gif)
无论执行思路方法是否成功
![](/icons/6651dou.gif)
都必须释放连接
6. 对得到后
![](/icons/6651de.gif)
内容进行处理
根据以上步骤
![](/icons/6651dou.gif)
我们来编写用GET思路方法来取得某网页内容
![](/icons/6651de.gif)
代码
![](/icons/6651dou2.gif)
大部分情况下 HttpClient 默认
![](/icons/6651de.gif)
构造
![](/icons/6651hanshu.gif)
已经足够使用
![](/icons/6651dou2.gif)
HttpClient httpClient =
HttpClient
;
创建GET思路方法
![](/icons/6651de.gif)
例子
![](/icons/6651dou2.gif)
在GET思路方法
![](/icons/6651de.gif)
构造
![](/icons/6651hanshu.gif)
中传入待连接
![](/icons/6651de.gif)
地址即可
![](/icons/6651dou2.gif)
用GetMethod将会自动处理转发过程
![](/icons/6651dou.gif)
如果想要把自动处理转发过程去掉
![](/icons/6651de.gif)
话
![](/icons/6651dou.gif)
可以
![](/icons/6651diaoyong.gif)
思路方法
![](/icons/6651set.gif)
FollowRedirects(false)
![](/icons/6651dou2.gif)
GetMethod getMethod =
GetMethod("http://www.ibm.com/");
![](/icons/6651diaoyong.gif)
例子httpClient
![](/icons/6651de.gif)
executeMethod思路方法来执行getMethod
![](/icons/6651dou2.gif)
由于是执行在网络上
![](/icons/6651de.gif)
![](/icons/6651chengxu.gif)
![](/icons/6651dou.gif)
在运行executeMethod思路方法
![](/icons/6651de.gif)
时候
![](/icons/6651dou.gif)
需要处理两个异常
![](/icons/6651dou.gif)
分别是HttpException和IOException
![](/icons/6651dou2.gif)
引起第
![](/icons/6651yi.gif)
种异常
![](/icons/6651de.gif)
原因主要可能是在构造getMethod
![](/icons/6651de.gif)
时候传入
![](/icons/6651de.gif)
协议不对
![](/icons/6651dou.gif)
比如不小心将"http"写成"htp"
![](/icons/6651dou.gif)
或者服务器端返回
![](/icons/6651de.gif)
内容不正常等
![](/icons/6651dou.gif)
并且该异常发生是不可恢复
![](/icons/6651de.gif)
;第 2种异常
![](/icons/6651yi.gif)
般是由于网络原因引起
![](/icons/6651de.gif)
异常
![](/icons/6651dou.gif)
对于这种异常 (IOException)
![](/icons/6651dou.gif)
HttpClient会根据你指定
![](/icons/6651de.gif)
恢复策略自动试着重新执行executeMethod思路方法
![](/icons/6651dou2.gif)
HttpClient
![](/icons/6651de.gif)
恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)
![](/icons/6651dou2.gif)
通过httpClient
![](/icons/6651de.gif)
思路方法
![](/icons/6651set.gif)
Parameter设置你实现
![](/icons/6651de.gif)
恢复策略
![](/icons/6651dou.gif)
本文中使用
![](/icons/6651de.gif)
是系统提供
![](/icons/6651de.gif)
默认恢复策略
![](/icons/6651dou.gif)
该策略在碰到第 2类异常
![](/icons/6651de.gif)
时候将自动重试3次
![](/icons/6651dou2.gif)
executeMethod返回值是
![](/icons/6651yi.gif)
个整数
![](/icons/6651dou.gif)
表示了执行该思路方法后服务器返回
![](/icons/6651de.gif)
状态码
![](/icons/6651dou.gif)
该状态码能表示出该思路方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod
![](/icons/6651de.gif)
例子是自动处理跳转
![](/icons/6651de.gif)
)等
![](/icons/6651dou2.gif)
//设置成了默认
恢复策略
在发生异常时候将自动重试3次
在这里你也可以设置成自定义
恢复策略
getMethod.getParams
.
Parameter(HttpMethodParams.RETRY_HANDLER,
DefaultHttpMethodRetryHandler
);
//执行getMethod
statusCode = client.executeMethod(getMethod);
(statusCode != HttpStatus.SC_OK) {
.err.pr
ln("Method failed: " + getMethod.getStatusLine
);
}
在返回
![](/icons/6651de.gif)
状态码正确后
![](/icons/6651dou.gif)
即可取得内容
![](/icons/6651dou2.gif)
取得目标地址
![](/icons/6651de.gif)
内容有 3种思路方法:第
![](/icons/6651yi.gif)
种
![](/icons/6651dou.gif)
getResponseBody
![](/icons/6651dou.gif)
该思路方法返回
![](/icons/6651de.gif)
是目标
![](/icons/6651de.gif)
2进制
![](/icons/6651de.gif)
![](/icons/6651byte.gif)
流;第 2种
![](/icons/6651dou.gif)
getResponseBodyAsString
![](/icons/6651dou.gif)
这个思路方法返回
![](/icons/6651de.gif)
是String类型
![](/icons/6651dou.gif)
值得注意
![](/icons/6651de.gif)
是该思路方法返回
![](/icons/6651de.gif)
String
![](/icons/6651de.gif)
编码是根据系统默认
![](/icons/6651de.gif)
编码方式
![](/icons/6651dou.gif)
所以返回
![](/icons/6651de.gif)
String值可能编码类型有误
![](/icons/6651dou.gif)
在本文
![](/icons/6651de.gif)
"
![](/icons/6651zifu.gif)
编码"部分中将对此做详细介绍;第 3种
![](/icons/6651dou.gif)
getResponseBodyAsStream
![](/icons/6651dou.gif)
这个思路方法对于目标地址中有大量数据需要传输是最佳
![](/icons/6651de.gif)
![](/icons/6651dou2.gif)
在这里我们使用了最简单
![](/icons/6651de.gif)
getResponseBody思路方法
![](/icons/6651dou2.gif)
![](/icons/6651byte.gif)
responseBody = method.getResponseBody
;
释放连接
![](/icons/6651dou2.gif)
无论执行思路方法是否成功
![](/icons/6651dou.gif)
都必须释放连接
![](/icons/6651dou2.gif)
method.releaseConnection
;
处理内容
![](/icons/6651dou2.gif)
在这
![](/icons/6651yi.gif)
步中根据你
![](/icons/6651de.gif)
需要处理内容
![](/icons/6651dou.gif)
在例子中只是简单
![](/icons/6651de.gif)
将内容打印到控制台
![](/icons/6651dou2.gif)
.out.pr
ln(
String(responseBody));
下面是
![](/icons/6651chengxu.gif)
![](/icons/6651de.gif)
完整代码
![](/icons/6651dou.gif)
这些代码也可在附件中
![](/icons/6651de.gif)
test.GetSample中找到
![](/icons/6651dou2.gif)
package test;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public
GetSample{
public
void
(String
args) {
//构造HttpClient
例子
HttpClient httpClient =
HttpClient
;
//创建GET思路方法
例子
GetMethod getMethod =
GetMethod("http://www.ibm.com");
//使用系统提供
默认
恢复策略
getMethod.getParams
.
Parameter(HttpMethodParams.RETRY_HANDLER,
DefaultHttpMethodRetryHandler
);
try {
//执行getMethod
statusCode = httpClient.executeMethod(getMethod);
(statusCode != HttpStatus.SC_OK) {
.err.pr
ln("Method failed: "
+ getMethod.getStatusLine
);
}
//读取内容
![](/icons/6651byte.gif)
responseBody = getMethod.getResponseBody
;
//处理内容
.out.pr
ln(
String(responseBody));
} catch (HttpException e) {
//发生致命
异常
可能是协议不对或者返回
内容有问题
.out.pr
ln("Please check your provided http address!");
e.pr
StackTrace
;
} catch (IOException e) {
//发生网络异常
e.pr
StackTrace
;
} finally {
//释放连接
getMethod.releaseConnection
;
}
}
}
POST思路方法
根据RFC2616
![](/icons/6651dou.gif)
对POST
![](/icons/6651de.gif)
解释如下:POST思路方法用来向目
![](/icons/6651de.gif)
服务器发出请求
![](/icons/6651dou.gif)
要求它接受被附在请求后
![](/icons/6651de.gif)
实体
![](/icons/6651dou.gif)
并把它当作请求队列(Request-Line)中请求URI所指定资源
![](/icons/6651de.gif)
附加新子项
![](/icons/6651dou2.gif)
POST被设计成用统
![](/icons/6651yi.gif)
![](/icons/6651de.gif)
思路方法实现下列功能:
对现有资源
![](/icons/6651de.gif)
注释(Annotation of existing resources)
向电子公告栏、新闻组
![](/icons/6651dou.gif)
邮件列表或类似讨论组发送消息
提交数据块
![](/icons/6651dou.gif)
如将表单
![](/icons/6651de.gif)
结果提交给数据处理过程
通过附加操作来扩展数据库
![](/icons/6651diaoyong.gif)
HttpClient中
![](/icons/6651de.gif)
PostMethod和GetMethod类似
![](/icons/6651dou.gif)
除了设置PostMethod
![](/icons/6651de.gif)
例子和GetMethod有些区别的外
![](/icons/6651dou.gif)
剩下
![](/icons/6651de.gif)
步骤都差不多
![](/icons/6651dou2.gif)
在下面
![](/icons/6651de.gif)
例子中
![](/icons/6651dou.gif)
省去了和GetMethod相同
![](/icons/6651de.gif)
步骤
![](/icons/6651dou.gif)
只介绍说明和上面区别
![](/icons/6651de.gif)
地方
![](/icons/6651dou.gif)
并以登录清华大学BBS为例子进行介绍说明
![](/icons/6651dou2.gif)
构造PostMethod的前
![](/icons/6651de.gif)
步骤都相同
![](/icons/6651dou.gif)
和GetMethod
![](/icons/6651yi.gif)
样
![](/icons/6651dou.gif)
构造PostMethod也需要
![](/icons/6651yi.gif)
个URI参数
![](/icons/6651dou.gif)
在本例中
![](/icons/6651dou.gif)
登录
![](/icons/6651de.gif)
地址是http://www.
![](/icons/6651new.gif)
smth.net/bbslogin2.php
![](/icons/6651dou2.gif)
在创建了PostMethod
![](/icons/6651de.gif)
例子的后
![](/icons/6651dou.gif)
需要给method例子填充表单
![](/icons/6651de.gif)
值
![](/icons/6651dou.gif)
在BBS
![](/icons/6651de.gif)
登录表单中需要有两个域
![](/icons/6651dou.gif)
第
![](/icons/6651yi.gif)
个是用户名(域名叫id)
![](/icons/6651dou.gif)
第 2个是密码(域名叫passwd)
![](/icons/6651dou2.gif)
表单中
![](/icons/6651de.gif)
域用类NameValuePair来表示
![](/icons/6651dou.gif)
该类
![](/icons/6651de.gif)
构造
![](/icons/6651hanshu.gif)
第
![](/icons/6651yi.gif)
个参数是域名
![](/icons/6651dou.gif)
第 2参数是该域
![](/icons/6651de.gif)
值;将表单所有
![](/icons/6651de.gif)
值设置到PostMethod中用思路方法
![](/icons/6651set.gif)
RequestBody
![](/icons/6651dou2.gif)
另外由于BBS登录成功后会转向另外
![](/icons/6651yi.gif)
个页面
![](/icons/6651dou.gif)
但是HttpClient对于要求接受后继服务
![](/icons/6651de.gif)
请求
![](/icons/6651dou.gif)
比如POST和PUT
![](/icons/6651dou.gif)
不支持自动转发
![](/icons/6651dou.gif)
因此需要自己对页面转向做处理
![](/icons/6651dou2.gif)
具体
![](/icons/6651de.gif)
页面转向处理请参见下面
![](/icons/6651de.gif)
"自动转向"部分
![](/icons/6651dou2.gif)
代码如下:
String url = "http://www.
smth.net/bbslogin2.php";
PostMethod postMethod =
PostMethod(url);
// 填入各个表单域
值
NameValuePair
data = {
NameValuePair("id", "youUserName"),
NameValuePair("passwd", "yourPwd") };
// 将表单
值放入postMethod中
postMethod.
RequestBody(data);
// 执行postMethod
statusCode = httpClient.executeMethod(postMethod);
// HttpClient对于要求接受后继服务
请求
象POST和PUT等不能自动处理转发
// 301或者302
(statusCode
HttpStatus.SC_MOVED_PERMANENTLY ||
statusCode
HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向
地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
(locationHeader != null) {
location = locationHeader.getValue
;
.out.pr
ln("The page was redirected to:" + location);
}
{
.err.pr
ln("Location field value is null.");
}
;
}
完整
![](/icons/6651de.gif)
![](/icons/6651chengxu.gif)
代码请参见附件中
![](/icons/6651de.gif)
test.PostSample
使用HttpClient过程中常见
![](/icons/6651de.gif)
![](/icons/6651yi.gif)
些问题
下面介绍在使用HttpClient过程中常见
![](/icons/6651de.gif)
![](/icons/6651yi.gif)
些问题
![](/icons/6651zifu.gif)
编码
某目标页
![](/icons/6651de.gif)
编码可能出现在两个地方
![](/icons/6651dou.gif)
第
![](/icons/6651yi.gif)
个地方是服务器返回
![](/icons/6651de.gif)
http头中
![](/icons/6651dou.gif)
另外
![](/icons/6651yi.gif)
个地方是得到
![](/icons/6651de.gif)
html/xml页面中
![](/icons/6651dou2.gif)
在http头
![](/icons/6651de.gif)
Content-Type字段可能会包含
![](/icons/6651zifu.gif)
编码信息
![](/icons/6651dou2.gif)
例如可能返回
![](/icons/6651de.gif)
头会包含这样子
![](/icons/6651de.gif)
信息:Content-Type: text/html; char
![](/icons/6651set.gif)
=UTF-8
![](/icons/6651dou2.gif)
这个头信息表明该页
![](/icons/6651de.gif)
编码是UTF-8
![](/icons/6651dou.gif)
但是服务器返回
![](/icons/6651de.gif)
头信息未必和内容能匹配上
![](/icons/6651dou2.gif)
比如对于
![](/icons/6651yi.gif)
些双字节语言国家
![](/icons/6651dou.gif)
可能服务器返回
![](/icons/6651de.gif)
编码类型是UTF-8
![](/icons/6651dou.gif)
但真正
![](/icons/6651de.gif)
内容却不是UTF-8编码
![](/icons/6651de.gif)
![](/icons/6651dou.gif)
因此需要在另外
![](/icons/6651de.gif)
地方去得到页面
![](/icons/6651de.gif)
编码信息;但是如果服务器返回
![](/icons/6651de.gif)
编码不是UTF-8
![](/icons/6651dou.gif)
而是具体
![](/icons/6651de.gif)
![](/icons/6651yi.gif)
些编码
![](/icons/6651dou.gif)
比如gb2312等
![](/icons/6651dou.gif)
那服务器返回
![](/icons/6651de.gif)
可能是正确
![](/icons/6651de.gif)
编码信息
![](/icons/6651dou2.gif)
通过method对象
![](/icons/6651de.gif)
getResponseCharSet
![](/icons/6651kh.gif)
思路方法就可以得到http头中
![](/icons/6651de.gif)
编码信息
对于象xml或者html这样
![](/icons/6651de.gif)
文件
![](/icons/6651dou.gif)
允许作者在页面中直接指定编码类型
![](/icons/6651dou2.gif)
比如在html中会有<meta http-equiv="Content-Type" content="text/html; char
![](/icons/6651set.gif)
=gb2312"/>这样
![](/icons/6651de.gif)
标签;或者在xml中会有<?xml version="1.0" encoding="gb2312"?>这样
![](/icons/6651de.gif)
标签
![](/icons/6651dou.gif)
在这些情况下
![](/icons/6651dou.gif)
可能和http头中返回
![](/icons/6651de.gif)
编码信息冲突
![](/icons/6651dou.gif)
需要用户自己判断到底那种编码类型应该是真正
![](/icons/6651de.gif)
编码
自动转向
根据RFC2616中对自动转向
![](/icons/6651de.gif)
定义
![](/icons/6651dou.gif)
主要有两种:301和302
![](/icons/6651dou2.gif)
301表示永久
![](/icons/6651de.gif)
移走(Moved Permanently)
![](/icons/6651dou.gif)
当返回
![](/icons/6651de.gif)
是301
![](/icons/6651dou.gif)
则表示请求
![](/icons/6651de.gif)
资源已经被移到
![](/icons/6651yi.gif)
个固定
![](/icons/6651de.gif)
新地方
![](/icons/6651dou.gif)
任何向该地址发起请求都会被转到新
![](/icons/6651de.gif)
地址上
![](/icons/6651dou2.gif)
302表示暂时
![](/icons/6651de.gif)
转向
![](/icons/6651dou.gif)
比如在服务器端
![](/icons/6651de.gif)
servlet
![](/icons/6651chengxu.gif)
![](/icons/6651diaoyong.gif)
了sendRedirect思路方法
![](/icons/6651dou.gif)
则在客户端就会得到
![](/icons/6651yi.gif)
个302
![](/icons/6651de.gif)
代码
![](/icons/6651dou.gif)
这时服务器返回
![](/icons/6651de.gif)
头信息中location
![](/icons/6651de.gif)
值就是sendRedirect转向
![](/icons/6651de.gif)
目标地址
![](/icons/6651dou2.gif)
HttpClient支持自动转向处理
![](/icons/6651dou.gif)
但是象POST和PUT方式这种要求接受后继服务
![](/icons/6651de.gif)
请求方式
![](/icons/6651dou.gif)
暂时不支持自动转向
![](/icons/6651dou.gif)
因此如果碰到POST方式提交后返回
![](/icons/6651de.gif)
是301或者302
![](/icons/6651de.gif)
话需要自己处理
![](/icons/6651dou2.gif)
就像刚才在POSTMethod中举
![](/icons/6651de.gif)
例子:如果想进入登录BBS后
![](/icons/6651de.gif)
页面
![](/icons/6651dou.gif)
必须重新发起登录
![](/icons/6651de.gif)
请求
![](/icons/6651dou.gif)
请求
![](/icons/6651de.gif)
地址可以在头字段location中得到
![](/icons/6651dou2.gif)
不过需要注意
![](/icons/6651de.gif)
是
![](/icons/6651dou.gif)
有时候location返回
![](/icons/6651de.gif)
可能是相对路径
![](/icons/6651dou.gif)
因此需要对location返回
![](/icons/6651de.gif)
值做
![](/icons/6651yi.gif)
些处理才可以发起向新地址
![](/icons/6651de.gif)
请求
![](/icons/6651dou2.gif)
另外除了在头中包含
![](/icons/6651de.gif)
信息可能使页面发生重定向外
![](/icons/6651dou.gif)
在页面中也有可能会发生页面
![](/icons/6651de.gif)
重定向
![](/icons/6651dou2.gif)
引起页面自动转发
![](/icons/6651de.gif)
标签是:<meta http-equiv="refresh" content="5; url=http://www.ibm.com/us">
![](/icons/6651dou2.gif)
如果你想在
![](/icons/6651chengxu.gif)
中也处理这种情况
![](/icons/6651de.gif)
话得自己分析页面来实现转向
![](/icons/6651dou2.gif)
需要注意
![](/icons/6651de.gif)
是
![](/icons/6651dou.gif)
在上面那个标签中url
![](/icons/6651de.gif)
值也可以是
![](/icons/6651yi.gif)
个相对地址
![](/icons/6651dou.gif)
如果是这样
![](/icons/6651de.gif)
话
![](/icons/6651dou.gif)
需要对它做
![](/icons/6651yi.gif)
些处理后才可以转发
![](/icons/6651dou2.gif)
处理HTTPS协议
HttpClient提供了对SSL
![](/icons/6651de.gif)
支持
![](/icons/6651dou.gif)
在使用SSL的前必须安装JSSE
![](/icons/6651dou2.gif)
在Sun提供
![](/icons/6651de.gif)
1.4以后
![](/icons/6651de.gif)
版本中
![](/icons/6651dou.gif)
JSSE已经集成到JDK中
![](/icons/6651dou.gif)
如果你使用
![](/icons/6651de.gif)
是JDK1.4以前
![](/icons/6651de.gif)
版本则必须安装JSSE
![](/icons/6651dou2.gif)
JSSE区别
![](/icons/6651de.gif)
厂家有区别
![](/icons/6651de.gif)
实现
![](/icons/6651dou2.gif)
下面介绍如何使用HttpClient来打开Https连接
![](/icons/6651dou2.gif)
这里有两种思路方法可以打开https连接
![](/icons/6651dou.gif)
第
![](/icons/6651yi.gif)
种就是得到服务器颁发
![](/icons/6651de.gif)
证书
![](/icons/6651dou.gif)
然后导入到本地
![](/icons/6651de.gif)
keystore中;另外
![](/icons/6651yi.gif)
种办法就是通过扩展HttpClient
![](/icons/6651de.gif)
类来实现自动接受证书
![](/icons/6651dou2.gif)
思路方法1
![](/icons/6651dou.gif)
取得证书
![](/icons/6651dou.gif)
并导入本地
![](/icons/6651de.gif)
keystore:
安装JSSE (如果你使用
![](/icons/6651de.gif)
JDK版本是1.4或者1.4以上就可以跳过这
![](/icons/6651yi.gif)
步)
![](/icons/6651dou2.gif)
本文以IBM
![](/icons/6651de.gif)
JSSE为例子介绍说明
![](/icons/6651dou2.gif)
先到IBM网站WebSite上下载JSSE
![](/icons/6651de.gif)
安装包
![](/icons/6651dou2.gif)
然后解压开的后将ibmjsse.jar包拷贝到<java-home>libext目录下
取得并且导入证书
![](/icons/6651dou2.gif)
证书可以通过IE来获得: 1. 用IE打开需要连接
![](/icons/6651de.gif)
https网址
![](/icons/6651dou.gif)
会弹出如下对话框:
![](http://www.crazycoder.cn/WebFiles/20091/75c2b4bd-2954-486d-b082-f33f9dd517da.png)
Protocol("https",
![](/icons/6651new.gif)
MySecureProtocolSocketFactory
![](/icons/6651kh.gif)
, 443);
注册刚才创建
![](/icons/6651de.gif)
https协议对象
Protocol.registerProtocol("https ", myhttps);
然后按照普通编程方式打开https
![](/icons/6651de.gif)
目标地址
![](/icons/6651dou.gif)
代码请参见test.NoCert
![](/icons/6651if.gif)
icationHttpsGetSample
处理代理服务器
HttpClient中使用代理服务器非常简单
![](/icons/6651dou.gif)
![](/icons/6651diaoyong.gif)
HttpClient中
![](/icons/6651set.gif)
Proxy思路方法就可以
![](/icons/6651dou.gif)
思路方法
![](/icons/6651de.gif)
第
![](/icons/6651yi.gif)
个参数是代理服务器地址
![](/icons/6651dou.gif)
第 2个参数是端口号
![](/icons/6651dou2.gif)
另外HttpClient也支持SOCKS代理
![](/icons/6651dou2.gif)
httpClient.getHostConfiguration
.
Proxy(hostName,port);
结论
从上面
![](/icons/6651de.gif)
介绍中
![](/icons/6651dou.gif)
可以知道HttpClient对http协议支持非常好
![](/icons/6651dou.gif)
使用起来很简单
![](/icons/6651dou.gif)
版本更新快
![](/icons/6651dou.gif)
功能也很强大
![](/icons/6651dou.gif)
具有足够
![](/icons/6651de.gif)
灵活性和扩展性
![](/icons/6651dou2.gif)
对于想在Java应用中直接访问http资源
![](/icons/6651de.gif)
编程人员来说
![](/icons/6651dou.gif)
HttpClient是
![](/icons/6651yi.gif)
个不可多得
![](/icons/6651de.gif)
好工具