HttpClient学习整理.docx
《HttpClient学习整理.docx》由会员分享,可在线阅读,更多相关《HttpClient学习整理.docx(11页珍藏版)》请在冰豆网上搜索。
![HttpClient学习整理.docx](https://file1.bdocx.com/fileroot1/2022-10/27/378b14bd-212a-49b8-8bf8-9a0134fe8aed/378b14bd-212a-49b8-8bf8-9a0134fe8aed1.gif)
HttpClient学习整理
HttpClient是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴。
在网上整理了一些东西,写得很好,寄放在这里。
HTTP协议可能是现在Internet上使用得最多、最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源。
虽然在JDK的包中已经提供了访问HTTP协议的基本功能,但是对于大部分应用程序来说,JDK库本身提供的功能还不够丰富和灵活。
HttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
HttpClient已经应用在很多的项目中,比如ApacheJakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient,更多使用HttpClient的应用可以参见http:
//wiki.apache.org/jakarta-httpclient/HttpClientPowered。
HttpClient项目非常活跃,使用的人还是非常多的。
目前HttpClient版本是在2005.10.11发布的3.0RC4。
------------------------------------
应用HttpClient来对付各种顽固的WEB服务器
转自:
一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。
所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。
目前我们使用的浏览器处理这些情况都不会构成问题。
不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。
如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。
但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。
我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。
为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!
况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!
再有如通过HTTP来上传文件呢?
不需要头疼,这些问题有了“它”就很容易解决了!
我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。
当然了,正如前面说到的,如果我们自己使用.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。
commons下本来已经有一个net的子项目,但是又把httpclient单独提出来,可见http服务器的访问绝非易事。
Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。
通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给httpclient替你完成。
本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们,为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容,然后循序渐进解决掉前进中的所有问题。
1.读取网页(HTTP/HTTPS)内容
下面是我们给出的一个简单的例子用来访问某个页面
/*
*Createdon2003-12-14byLiudong
*/
packagehttp.demo;
importjava.io.IOException;
importmons.httpclient.*;
importmons.httpclient.methods.*;
/**
*最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面
*@authorLiudong
*/
publicclassSimpleClient{
publicstaticvoidmain(String[]args)throwsIOException
{
HttpClientclient=newHttpClient();
//设置代理服务器地址和端口
//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
//使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
HttpMethodmethod=newGetMethod("");
//使用POST方法
//HttpMethodmethod=newPostMethod("");
client.executeMethod(method);
//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印返回的信息
System.out.println(method.getResponseBodyAsString());
//释放连接
method.releaseConnection();
}
}
在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。
这就是使用HttpClient的基本流程。
其实用一行代码也就可以搞定整个请求的过程,非常的简单!
2.以GET或者POST方式向网页提交参数
其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时设定页面所需的参数,我们知道如果是GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:
/*
*Createdon2003-12-7byLiudong
*/
packagehttp.demo;
importjava.io.IOException;
importmons.httpclient.*;
importmons.httpclient.methods.*;
/**
*提交参数演示
*该程序连接到一个用于查询手机号码所属地的页面
*以便查询号码段1330227所在的省份以及城市
*@authorLiudong
*/
publicclassSimpleHttpClient{
publicstaticvoidmain(String[]args)throwsIOException{
HttpClientclient=newHttpClient();
client.getHostConfiguration().setHost("",80,"http");
method=getPostMethod();//使用POST方式提交数据
client.executeMethod(method);//打印服务器返回的状态
System.out.println(method.getStatusLine());//打印结果页面
Stringresponse=newString(method.getResponseBodyAsString().getBytes("8859_1"));
//打印返回的信息
System.out.println(response);
method.releaseConnection();
}
/**
*使用GET方式提交数据
*@return
*/
privatestaticHttpMethodgetGetMethod(){
returnnewGetMethod("/simcard.php?
simcard=1330227");
}
/**
*使用POST方式提交数据
*@return
*/
privatestaticHttpMethodgetPostMethod(){
PostMethodpost=newPostMethod("/simcard.php");
NameValuePairsimcard=newNameValuePair("simcard","1330227");
post.setRequestBody(newNameValuePair[]{simcard});
returnpost;
}
}
在上面的例子中页面
3.处理页面重定向
在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。
它与JSP中的forward…>的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。
就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。
如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。
状