`
huchaoqqqq
  • 浏览: 11922 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HttpClient4.0&HtmlCleaner用法

阅读更多
****************************HttpClient4.0用法*****************************
1、初始化HttpParams,设置组件参数
        //HttpParams接口代表一个不可改变值的集合,定义一个组件运行时行为。代表一个对象集合,该集合是一个键到值的映射。
//HttpParams作用是定义其他组件的行为,一般每个复杂的组件都有它自己的HttpParams对象。
 
   HttpParams params = new BasicHttpParams();

   // HTTP 协议的版本,1.1/1.0/0.9
   HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
   HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
   HttpProtocolParams.setUseExpectContinue(params, true);
  
   ConnManagerParams.setMaxTotalConnections(params, maxconnections); // 设置最大连接数maxconnections);
   ConnManagerParams.setTimeout(params, timeout*1000);  // 设置超时时间 timeout 秒
2、初始化SchemeRegistry,设置访问协议
         //Scheme类表示一个协议方案,例如"http"或者"https"和包含许多的协议属性,
         //例如缺省的端口和socket工厂常用于为指定的协议创建java.net.Socket实例,SchemeRegistry类被用来维护一个Schemes的集合
   SchemeRegistry schemeRegistry = new SchemeRegistry();
   schemeRegistry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
   schemeRegistry.register(new Scheme("https", SSLSocketFactory
.getSocketFactory(), 443));
3、初始化httpclient会话连接管理器
         //HTTP连接是复杂、有状态的,非线程安全的对象需要适当的管理正确的功能。HTTP连接每次仅被一个执行的线程使用,
         //HttpClient利用一个特殊的实体管理访问HTTP连接,称为HTTP连接管理器,由ClientConnectionManager接口表示。
         //HTTP连接管理器的充当一个新的HTTP连接工厂,管理持续的连接和同步的访问持续的连接,确保每次只有一个线程能访问连接。
   ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,
schemeRegistry);
4、初始化httpClient并加入会话连接管理器,此步很重要,对于使用httpclient多线程并发访问服务系统很有用
         //HttpClient最重要的功能是执行HTTP方法。执行一个HTTP方法涉及一个或多个HTTP请求/ HTTP响应信息交流,
         //通常是由HttpClient内部处理。用户提供一个请求对象,HttpClient发送请求到目标服务器,
         //希望服务器返回一个相应的响应对象,或者抛出一个异常(如果执行失败)。
   HttpClient httpClient = new DefaultHttpClient(connectionManager, params);
5、定义HttpHost
         // HttpHost代表访问的主机
         String sHost = "www.hao123.com"; //访问服务器的主网址
         httpHost = new HttpHost(sHost);

6、执行get请求
6.1 先定义方法getResponseContent,用来根据指定系统编码获取响应主体内容,很有用的方法
         public String getResponseContent(HttpEntity responseEntity)
throws Exception {
byte[] bytes = EntityUtils.toByteArray(responseEntity);
                String sCharSet="GB2312";       //这里可以定义你指定的编码,中文网站编码一般为GB2312
return new String(bytes, sCharSet);
}
        
6.2 执行get请求,获取响应的html内容
         String sURL="/abc/index.html"; //定义你需要访问的网址后面的路径      
         HttpGet httpGet = new HttpGet(sURL);//定义get请求
         HttpResponse httpResponse = httpClient.execute(httpHost, httpGet); //使用httpclient执行get请求并返回响应  访问的网址为 www.hao123.com/abc/index.html
         // 2 获取响应
HttpEntity responseEntity = httpResponse.getEntity();
String sReturnHtml = getResponseContent(responseEntity);//得到get请求返回的html页面,然后就做你想做的东西了
         //比如解析html页面,得到你想得到的东西
        
         httpGet.abort();//释放连接资源,很重要,不能缺少
        
7、执行post请求
7.1初始化httppost
   String sURL="/abc/index.html";
   HttpPost httpPost = new HttpPost(sURL);
7.2设置Post请求参数NameValuePair
   List<NameValuePair> nvps = new ArrayList<NameValuePair>();
   nvps.add(new BasicNameValuePair("name", "testname"));
   nvps.add(new BasicNameValuePair("password", "testpassword")); 
7.3把请求参数按指定编码设置到httppost中,设置httppost请求头内容,可解决中文乱码问题,非常重要
   String sCharSet="GB2312";
   httpPost.setEntity(new UrlEncodedFormEntity(nvps, sCharSet));
   // ---begin解决中文乱码问题
   httpPost.addHeader("Content-Type","application/x-www-form-urlencoded");
   httpPost.addHeader("Accept-Language", "zh-cn");
   httpPost.addHeader("Accept-Encoding", "gzip, deflate");
   // ---end
7.4执行post请求,得到响应做其他操作
  
   HttpResponse httpResponse = httpClient.execute(httpHost, httpPost);
   HttpEntity responseEntity = httpResponse.getEntity();
   String sHtml = getResponseContent(responseEntity);
  
   httpPost.abort();//释放连接资源

8
   connectionManager.shutdown();//关闭连接管理器
  
总结:使用httpclient访问需要用户登录的网站做相关操作,需要从登录、判断登录成功、做你想要的事情、退出 一连贯动作
      因为大部分网站服务器是根据用户访问的会话session来判断一个用户是否在线的才能做相关操作,所以退出动作不实现的话,
      在httpclient多线程并发访问网站的时候,服务器会出现数据混乱等想不到的状况。
      判断登录是否成功这个问题,我的解决方案是获取登录POST请求返回响应,然后从响应中获取重定向地址。
      一般的WEB服务系统设计时,登录成功和失败返回的重定向地址是不一致的。所以我只要判断返回的重定向地址是否是成功的就可以了。
         /****
* 获取响应头重定向地址
* @param response
* @return
*/
public String getRedirectLocation(HttpResponse response) {
String sReturn;
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
sReturn = "";
} else {
sReturn = locationHeader.getValue();
}
if (log.isDebugEnabled()) {
log.debug("##########重定向URL:" + sReturn);
}
return sReturn;
}
      
      POST请求中文乱码问题在网上搜索了很多方案,都无法解决,
      后来我用HttpAnalyzer分析用浏览器访问正常情况时,发现请求头中包含了三个参数 "Content-Type"、"Accept-Language"、
      "Accept-Encoding",在httppost中添加请求头加入这几个参数后,发现问题解决了。
    
      因为和4.0之前的版本比较,发生了很多变化,所以上面的总结对之前的版本不实用。
      需要的jar包:     
                    apache-mime4j-0.6.jar
                    commons-codec-1.3.jar
                    commons-logging-1.1.1.jar
                    httpclient-4.0.3.jar
                    httpcore-4.0.1.jar
                    httpmime-4.0.3.jar


**************************************************************************

*******************************htmlcleaner用法****************************
         String sHtml="";//网页内容
         HtmlCleaner cleaner = new HtmlCleaner();
         TagNode rootNode = cleaner.clean(sHtml);
         String XPath="//body//form//input";//用XPath语法来表示具体位置的路径
         Object[] subNodes = rootNode.evaluateXPath(sXPath);
for (int i = 0; i < subNodes.length; i++) {
TagNode inputNode = (TagNode) subNodes[i];
String sName = inputNode.getAttributeByName("name");
String sValue = inputNode.getAttributeByName("value");
}
         需要jar包:
                  htmlcleaner-2.2.jar
                 
**************************************************************************
分享到:
评论
4 楼 在世界的中心呼喚愛 2013-03-24  
哦。找到,原来是有上下文是有联系。
建议lz在开头说明下。
3 楼 在世界的中心呼喚愛 2013-03-24  
getResponseContent
这个是什么?
2 楼 huchaoqqqq 2011-10-18  
shenzhenyu 写道
请问你下 HttpParams    SchemeRegistry这两个参数初始化的时候要加什么包啊?
我也用了httpclient,复制了你上面的代码报了很多奇怪的语法错误
shenzhenyuyuyu@qq.com  望指教

不需要加其他包了,这几个包是全的,奇怪的错误,是我粘贴代码的时候,编辑了下,估计有些是中文状态下输入的,另外有的变量需要你自己定义下
1 楼 shenzhenyu 2011-10-14  
请问你下 HttpParams    SchemeRegistry这两个参数初始化的时候要加什么包啊?
我也用了httpclient,复制了你上面的代码报了很多奇怪的语法错误
shenzhenyuyuyu@qq.com  望指教

相关推荐

    httpclient4.0-jar

    在本篇文章中,我们将深入探讨HttpClient 4.0的核心特性,以及如何在实际开发中使用它。 首先,HttpClient 4.0的核心功能在于支持HTTP/1.1协议,包括GET、POST、PUT、DELETE等常见HTTP方法。它还支持HTTPS,确保...

    httpclient4.0

    在本文中,我们将深入探讨 HttpClient 4.0 的核心概念、使用方法以及它在实际开发中的应用场景。 一、HttpClient 4.0 概述 HttpClient 4.0 作为 Apache HttpClient 的一个主要版本,引入了许多新特性,如支持最新...

    httpclient4.0 使用帮助、例子

    本篇文章将详细介绍HTTPClient 4.0的使用方法,包括其核心概念、基本操作和示例代码。 一、核心概念 1. HttpClient实例:HttpClient对象是执行HTTP请求的核心,负责建立连接、发送请求和接收响应。通过`...

    Httpclient4.0和3.0及jsoup等相关jar包

    1.含有官方HttpClient4.0的jar包 2.有之前HttpClient3.0的jar包,就是import importorg.apache.commons.*; 3.包含jsoup,解析HTML的jar包 4.包含jcookie.jar及jtidy-r938.jar的jar包.

    httpclient4.0源文件

    《HttpClient 4.0源码解析》 HttpClient是一款由Apache软件基金会开发的开源HTTP客户端库,主要用于处理HTTP请求和响应。HttpClient 4.0版本是其一个重要里程碑,它提供了更加强大、灵活和稳定的网络通信功能。在这...

    基于Java + HTTPClient 4.0,采用MySQL存储爬取数据,支持多进程并发执行的新浪微博爬虫

    【作品名称】:基于Java + HTTPClient 4.0,采用MySQL存储爬取数据,支持多进程并发执行的新浪微博爬虫 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训...

    httpclient-4.0.jar

    httpclient-4.0.jar, httpclient-4.0.jar, httpclient-4.0.jar

    原创: httpclient 4.0 使用 - 访问开心网的各种组件 例子

    《HttpClient 4.0 使用详解:访问开心网组件实例》 HttpClient 是 Apache 开源基金会提供的一个 HTTP 客户端库,被广泛应用于 Java 开发中,用于执行 HTTP 请求。HttpClient 4.0 版本引入了许多改进和新特性,使得...

    HttpClient 4.0的post()方法4个关键“头信息”设置

    在探讨HttpClient 4.0的`post()`方法中四个关键“头信息”的设置之前,我们首先需要理解HttpClient是什么以及它在Java开发中的作用。 ### HttpClient简介 HttpClient是Apache的一个开源项目,它为Java应用程序提供...

    HttpClient 4.0学习

    本篇将深入探讨HttpClient 4.0的主要功能、核心概念以及如何使用它。 1. **主要功能** HttpClient 4.0支持HTTP/1.1协议,并提供了多种功能,如: - 支持同步和异步请求 - 多种连接管理策略,如单一连接、多线程...

    Android升级后旧版本的httpclient4.0

    Android升级后旧版本的httpclient4.0 apache-mime4j-0.6 commons-codec-1.4 commons-logging-1.1.1 httpclient-4.0.1 httpcore-4.0.1 httpmime-4.0.1

    httpclient-4.0-beta1.jar

    httpclient-4.0-beta1.jar

    HttpClient 4.0中文教程

    ### HttpClient 4.0中文教程知识点总结 #### 一、HttpClient概述 **1.1 执行请求** - **HTTP请求**: HTTP请求包含了方法名称(GET、POST等)、URL以及必要的请求头信息。HttpClient允许开发者创建并发送这些请求...

    [原创] Java 天气预告 - htmlparser2.0 + httpclient4.0

    接着,使用HttpClient的execute方法发送请求,并得到HttpResponse对象。从HttpResponse中,我们可以获取到HTTP状态码,以确认请求是否成功。如果成功,可以使用HttpEntity接口来读取响应体,即HTML内容。 获取到...

    commons-httpclient依赖包

    包括了httpclient的所有包,commons-httpclient3.0.jar,httpclient4.0.jar,commons-logging1.1.1.jar,commons-codec-1.3.jar等

    HttpClient&&HtmlParser(Crawler)网络爬虫

    3. 发送请求并接收响应:使用HttpClient的execute方法发送请求,然后获取HttpResponse对象。HttpResponse包含状态码、响应头和响应实体。 4. 处理响应:从HttpResponse中读取数据,如通过EntityUtils.toString方法...

    httpclient-4.0-beta2.jar

    httpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jarhttpclient-4.0-beta2.jar

    用httpclient-4.0-alpha2 打造基于http协议的网站分析器

    3. 发送请求:使用HttpClient的execute方法执行请求。 ```java CloseableHttpResponse response = httpClient.execute(httpGet); ``` 4. 处理响应:检查响应状态码,读取响应头和响应体。 ```java ...

    Commons HTTPClient4&#46;X组件应用示例

    ### Commons HTTPClient4.X 组件应用详解 #### 一、引言 ...传统的做法是使用浏览器或者基于JDK提供的`java.net`...对于需要频繁与Web服务器进行交互的应用程序而言,使用HttpClient4组件将极大提高开发效率和应用质量。

Global site tag (gtag.js) - Google Analytics