HttpClient 是基于java的Http Client端实现,其支持HTTP 1.0和HTTP 1.1, HttpClient自身对Http协议做了很多兼容,以便能和一些常用的Http 代理和Http server通信(这些代理和server没有严格按照协议标准来实现)。
HttpClient在本质上,是使用java的socket来和服务器通信,只不过通信的协议是采用HTTP协议而已。所以,为了成功通信,需要设置很多参数,主要分为两种:HTTP协议相关参数,(双方使用的协议版本号,是HTTP1.1还是HTTP1.0),还有一些是网络通信参数,比如连接的超时时间,是否使用tcpnodelay等。
HttpClient中,接口HttpParams定义了这些参数的通用接口,查看HttpParams,我们可以发现HttpParams支持层级结构,及一个HttpParams可以是另外一个HttpParams的parent,且当查找一个特定参数时,将从当前HttpParams中进行查找,如果当前层级中没有,则从其parent中进行查找。HttpParams的层级结构,是HttpClient设计上的一个特点。这样的设计,使得能够灵活的对httpclient进行参数设置。
在HttpClient中,具体实现了如下几种HttpParam,其类图结构如下:
HttpClient在设计上比较有特色的就是将这些参数实现为有层级的,查找一个具体的参数时,先从最低的级别的param开始查,如果没有,则向其父级参数查询,当查到时,总是返回最低级别的参数。
那么HttpClient为何要如此设计这种参数体系结构呢?这样的设计有什么好处呢?
在使用HttpClient时,程序要要操作的主要是如下几个类:HttpClient,HttpConnectionManager,HttpConnection,HostConfiguration,HttpMethod。HttpClient代表了一个http的客户端,HttpConnectionManager是用来管理HttpConnection的,HttpConnection代表了一个http连接,所以HttpConnectionManager其实质上也就是一个http连接池,管理这些http连接(和数据库连接池一个道理)。HttpMethod代表了一个Http方法,一个HttpClient可以运行多个HttpMethod(实质上,httpclient执行一个HttpMethod时,会从connectionmanager那里获取一个httpconnection,在此connection上执行该method,执行完该method后,让method 释放该httpconnection,从而将该httpconnection返回给connectionmanager,以便供后续的method使用)。
实例代码:
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); GetMethod httpget = new GetMethod(“/”);
httpget.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, new Integer(5000));
PostMethod httppost = new PostMethod(“/”);
try {
// Internally the parameter collections will be linked together
// by performing the following operations:
// hostconfig.getParams().setDefaults(httpclient.getParams());
// httpget.getParams().setDefaults(hostconfig.getParams());
httpclient.executeMethod(hostconfig, httpget);
httpclient.executeMethod(hostconfig,httppost);
System.out.println(“the http get:” + httpget.getParams().getParameter(HttpMethodParams.PROTOCOL_VERSION));
System.out.println(“the http get:” + httpget.getParams().getParameter(HttpMethodParams.SO_TIMEOUT));
System.out.println(“the http get:” + httpget.getParams().getParameter(HttpMethodParams.HTTP_CONTENT_CHARSET));
System.out.println(“the http post:” + httppost.getParams().getParameter(HttpMethodParams.SO_TIMEOUT));
}catch(HttpException e){
e.printStackTrace();
}catch(IOException ex){
ex.printStackTrace();
} finally {
httpget.releaseConnection();
}