HttpClient的用法.docx
- 文档编号:14785866
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:14
- 大小:20.40KB
HttpClient的用法.docx
《HttpClient的用法.docx》由会员分享,可在线阅读,更多相关《HttpClient的用法.docx(14页珍藏版)》请在冰点文库上搜索。
HttpClient的用法
HttpClient的用法
HTTP协议可能是现在Internet上使用得最多、最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源。
Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。
通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给httpclient替你完成。
首先,我们必须安装好HttpClient。
HttpClient可以在http:
//jakarta.apache.org/commons/httpclient/downloads.html下载.
HttpClient用到了ApacheJakartacommon下的子项目logging,你可以从这个地址http:
//jakarta.apache.org/site/downloads/downloads_commons-logging.cgi下载到commonlogging,从下载后的压缩包中取出commons-logging.jar加到CLASSPATH中.
HttpClient用到了ApacheJakartacommon下的子项目codec,你可以从这个地址http:
//jakarta.apache.org/site/downloads/downloads_commons-codec.cgi下载到最新的commoncodec,从下载后的压缩包中取出commons-codec-1.x.jar加到CLASSPATH中
1.读取网页(HTTP/HTTPS)内容
下面是我们给出的一个简单的例子用来访问某个页面
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后面用问号与页面地址隔开,每个参数用&隔开,例如:
?
name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。
本小节的例子演示向如何查询手机号码所在的城市,代码如下:
NameValuePair:
简单名称值对节点类NameValuePair.摘要:
本类位于System....NameValuePair。
主要用途是在DBConnectionString类中,解析ConnectionString时存储并串联Name/Value对。
packagehttp.demo;
importjava.io.IOException;
importmons.httpclient.*;
importmons.httpclient.methods.*;
/**
*提交参数演示
*该程序连接到一个用于查询手机号码所属地的页面
*以便查询号码段1330227所在的省份以及城市
*@authorLiudong
*/
publicclassSimpleHttpClient{
publicstaticvoidmain(String[]args)throwsIOException
{
HttpClientclient=newHttpClient();
client.getHostConfiguration().setHost("",80,"http");
HttpMethodmethod=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;
}
}
在上面的例子中页面/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。
GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值.
3.处理页面重定向
在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。
它与JSP中的 forward…>的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。 就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。 如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。 状态码 对应HttpServletResponse的常量 详细描述 301 SC_MOVED_PERMANENTLY 页面已经永久移到另外一个新地址 302 SC_MOVED_TEMPORARILY 页面暂时移动到另外一个新的地址 303 SC_SEE_OTHER 客户端请求的地址必须通过另外的URL来访问 307 SC_TEMPORARY_REDIRECT 同SC_MOVED_TEMPORARILY 下面的代码片段演示如何处理页面的重定向 client.executeMethod(post); System.out.println(post.getStatusLine().toString()); post.releaseConnection() //检查是否重定向 intstatuscode=post.getStatusCode(); if((statuscode==HttpStatus.SC_MOVED_TEMPORARILY)|| (statuscode==HttpStatus.SC_MOVED_PERMANENTLY)|| (statuscode==HttpStatus.SC_SEE_OTHER)|| (statuscode==HttpStatus.SC_TEMPORARY_REDIRECT)){ //读取新的URL地址 Headerheader=post.getResponseHeader("location"); if(header! =null){ Stringnewuri=header.getValue(); if((newuri==null)||(newuri.equals(""))) newuri="/"; GetMethodredirect=newGetMethod(newuri); client.executeMethod(redirect); System.out.println("Redirect: "+redirect.getStatusLine().toString()); redirect.releaseConnection(); }else System.out.println("Invalidredirect"); } 我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。 4.模拟输入用户名和口令进行登录 /* *Createdon2003-12-7byLiudong */ packagehttp.demo; importmons.httpclient.*; importmons.httpclient.cookie.*; importmons.httpclient.methods.*; /** *用来演示登录表单的示例 *@authorLiudong */ publicclassFormLoginDemo{ staticfinalStringLOGON_SITE="localhost"; staticfinalintLOGON_PORT=8080; publicstaticvoidmain(String[]args)throwsException{ HttpClientclient=newHttpClient(); client.getHostConfiguration().setHost(LOGON_SITE,LOGON_PORT); //模拟登录页面login.jsp->main.jsp PostMethodpost=newPostMethod("/main.jsp"); NameValuePairname=newNameValuePair("name","ld"); NameValuePairpass=newNameValuePair("password","ld"); post.setRequestBody(newNameValuePair[]{name,pass}); intstatus=client.executeMethod(post); System.out.println(post.getResponseBodyAsString()); post.releaseConnection(); //查看cookie信息 CookieSpeccookiespec=CookiePolicy.getDefaultSpec(); Cookie[]cookies=cookiespec.match(LOGON_SITE,LOGON_PORT,"/",false,client.getState().getCookies()); if(cookies.length==0){ System.out.println("None"); }else{ for(inti=0;i System.out.println(cookies[i].toString()); } } //访问所需的页面main2.jsp GetMethodget=newGetMethod("/main2.jsp"); client.executeMethod(get); System.out.println(get.getResponseBodyAsString()); get.releaseConnection(); } } 5.提交XML格式参数 提交XML格式的参数很简单,仅仅是一个提交时候的ContentType问题,下面的例子演示从文件文件中读取XML信息并提交给服务器的过程,该过程可以用来测试Web服务。 importjava.io.File; importjava.io.FileInputStream; importmons.httpclient.HttpClient; importmons.httpclient.methods.EntityEnclosingMethod; importmons.httpclient.methods.PostMethod; /** *用来演示提交XML格式数据的例子 */ publicclassPostXMLClient{ publicstaticvoidmain(String[]args)throwsException{ Fileinput=newFile(“test.xml”); PostMethodpost=newPostMethod(“http: //localhost: 8080/httpclient/xml.jsp”); //设置请求的内容直接从文件中读取 post.setRequestBody(newFileInputStream(input)); if(input.length() post.setRequestContentLength(input.length()); else post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); //指定请求内容的类型 post.setRequestHeader("Content-type","text/xml;charset=GBK"); HttpClienthttpclient=newHttpClient(); intresult=httpclient.executeMethod(post); System.out.println("Responsestatuscode: "+result); System.out.println("Responsebody: "); System.out.println(post.getResponseBodyAsString()); post.releaseConnection(); } }6.通过HTTP上传文件 httpclient使用了单独的一个HttpMethod子类来处理文件的上传,这个类就是MultipartPostMethod,该类已经封装了文件上传的细节,我们要做的仅仅是告诉它我们要上传文件的全路径即可,下面的代码片段演示如何使用这个类。 MultipartPostMethodfilePost=newMultipartPostMethod(targetURL); filePost.addParameter("fileName",targetFilePath); HttpClientclient=newHttpClient(); //由于要上传的文件可能比较大,因此在此设置最大的连接超时时间 client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); intstatus=client.executeMethod(filePost); 上面代码中,targetFilePath即为要上传的文件所在的路径。 7.访问启用认证的页面 我们经常会碰到这样的页面,当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可,这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。 这是HTTP的认证策略,httpclient支持三种认证方式包括: 基本、摘要以及NTLM认证。 其中基本认证最简单、通用但也最不安全;摘要认证是在HTTP1.1中加入的认证方式,而NTLM则是微软公司定义的而不是通用的规范,最新版本的NTLM是比摘要认证还要安全的一种方式。 下面例子是从httpclient的CVS服务器中下载的,它简单演示如何访问一个认证保护的页面: importmons.httpclient.HttpClient; importmons.httpclient.UsernamePasswordCredentials; importmons.httpclient.methods.GetMethod; publicclassBasicAuthenticationExample{ publicBasicAuthenticationExample(){ } publicstaticvoidmain(String[]args)throwsException{ HttpClientclient=newHttpClient(); client.getState().setCredentials( "", "realm", newUsernamePasswordCredentials("username","password") ); GetMethodget=newGetMethod(" get.setDoAuthentication(true); intstatus=client.executeMethod(get); System.out.println(status+""+get.getResponseBodyAsString()); get.releaseConnection(); } } 8.多线程模式下使用httpclient 多线程同时访问httpclient,例如同时从一个站点上下载多个文件。 对于同一个HttpConnection同一个时间只能有一个线程访问,为了保证多线程工作环境下不产生冲突,httpclient使用了一个多线程连接管理器的类: MultiThreadedHttpConnectionManager,要使用这个类很简单,只需要在构造HttpClient实例的时候传入即可,代码如下: MultiThreadedHttpConnectionManagerconnectionManager= newMultiThreadedHttpConnectionManager(); HttpClientclient=newHttpClient(connectionManager); 以后尽管访问client实例即可。 httpclient的多线程处理 使用多线程的主要目的,是为了实现并行的下载。 在httpclient运行的过程中,每个http协议的方法,使用一个HttpConnection实例。 由于连接是一种有限的资源,每个连接在某一时刻只能供一个线程和方法使用,所以需要确保在需要时正确地分配连接。 HttpClient采用了一种类似jdbc连接池的方法来管理连接,这个管理工作由MultiThreadedHttpConnectionManager完成。 MultiThreadedHttpConnectionManagerconnectionManager= newMultiThreadedHttpConnectionManager(); HttpClientclient=newHttpClient(connectionManager); 此是,client可以在多个线程中被用来执行多个方法。 每次调用HttpClient.executeMethod()方法,都会去链接管理器申请一个连接实例,申请成功这个链接实例被签出(checkout),随之在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HttpClient 用法