****************************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*); // 设置超时时间 timeout 秒

2、初始化SchemeRegistry,设置访问协议

   //Scheme类表示一个协议方案,例如"http"或者"https"和包含许多的协议属性,
//例如缺省的端口和socket工厂常用于为指定的协议创建java.net.Socket实例,SchemeRegistry类被用来维护一个Schemes的集合
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), ));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), ));

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请求
  ① 先定义方法getResponseContent,用来根据指定系统编码获取响应主体内容,很有用的方法

 public String getResponseContent(HttpEntity responseEntity) throws Exception {
    byte[] bytes = EntityUtils.toByteArray(responseEntity);
String sCharSet="GB2312"; //这里可以定义你指定的编码,中文网站编码一般为GB2312
    return new String(bytes, sCharSet);
}

 

 ②执行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
// 获取响应
 HttpEntity responseEntity = httpResponse.getEntity();
String sReturnHtml = getResponseContent(responseEntity);//得到get请求返回的html页面,然后就做你想做的东西了
//比如解析html页面,得到你想得到的东西
httpGet.abort();//释放连接资源,很重要,不能缺少

7、执行post请求

  ①初始化httppost

   String sURL="/abc/index.html";
HttpPost httpPost = new HttpPost(sURL);

  

  ②设置Post请求参数NameValuePair

   List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("name", "testname"));
nvps.add(new BasicNameValuePair("password", "testpassword"));

  ③把请求参数按指定编码设置到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

  ④执行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服务系统设计时,登录成功和失败返回的重定向地址是不一致的。所以我只要判断返回的重定向地址是否是成功的就可以了。

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

转自:http://blog.sina.com.cn/s/blog_5da93c8f0100t7wo.html

HttpClient4.0的更多相关文章

  1. Hbase 0.92.1 Replication

    原集群 服务器名称 服务 sht-sgmhadoopnn-01 Master,NameNode,JobTracker sht-sgmhadoopdn-01 RegionServer,DataNode, ...

  2. 看好你的门-客户端传数据-用java修改referer

    1.简单说明 Referer.origin用来表明,浏览器向WEB服务器表明自己来自哪里.但是就它本身而言,并非完全安全. 写一个例子,可以任意修改http信息头中的referer.origin 2. ...

  3. HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看

    转自:http://www.blogjava.net/stevenjohn/archive/2012/09/26/388609.html HttpClient程序包是一个实现了 HTTP 协议的客户端 ...

  4. dfs.datanode.max.xcievers参数导致hbase集群报错

    2013/08/09 转发自http://bkeep.blog.163.com/blog/static/123414290201272644422987/ [案例]dfs.datanode.max.x ...

  5. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  6. Hadoop build error java.lang.NoClassDefFoundError: org/sonatype/aether/graph/DependencyFilter

    When running the command: + mvn site site:stage -DskipTests -DskipTest -DskipITs   you get an error: ...

  7. Storm常见问题处理

    错误1:发布topologies到远程集群时,出现Nimbus host is not set异常.异常内容如下所示: [root@xop-dev-a bin]# ./storm jar /home/ ...

  8. 浅谈hbase表中数据导出导入(也就是备份)

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23916356&id=3321832 最近因为生产环境hbase ...

  9. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

随机推荐

  1. 完美PNG半透明窗体解决方案

    当年Vista系统刚出来的时候,最吸引人的莫过于半透明磨砂的窗体界面了,迷倒了多少人.这个界面技术随即引发了编程界的一阵骚动,很多人都在问:如何实现这一界面效果?当然,在Vista下倒是很简单,系统本 ...

  2. SQL SERVER CEILING 函数 取整时的坑。。。

    CEILING ---返回大于或等于指定数值表达式的最小整数 当舍去同一个大小的值 但是正负方向不一致时要注意小数位四舍五入的问题   例如: SELECT CEILING($123.45), CEI ...

  3. BTREE与其它索引的优缺点对比

    数据库BTree索引.Hash索引.Bitmap位图索引的优缺点 (2016-01-05 17:13:40) 转载▼ 标签: 数据库 索引 mysql oracle 分类: IT http://www ...

  4. Object-C非正式协议与正式协议的区别

    Object-C非正式协议与正式协议的区别 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是 ...

  5. 转:100个高质量Java开发者博客

    原文来自于:http://www.importnew.com/7469.html ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢 ...

  6. JSP session 获取id和session持续时间

    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> < ...

  7. 利用CSP探测网站登陆状态

    0x00 背景 今天看到zone里有同学发帖说了探测支付宝登录状态的帖子:http://zone.wooyun.org/content/17665 由此我想到了我们parsec的@/fd 半年前提到的 ...

  8. ubuntu 查本机 ip地址的命令是什么, 详细信息的?

    使用ifconfig命令即可.你一敲进去都出来了

  9. hdu 5144 NPY and shot

    http://acm.hdu.edu.cn/showproblem.php?pid=5144 题意:给你初始的高度和速度,然后让你求出水平的最远距离. 思路:三分枚举角度,然后根据公式求出水平距离. ...

  10. 追踪CM_CONTROLCHANGE消息的产生和执行过程,可以较好的领会VCL的思想(就是到处通知,但耦合性很弱)

    追踪CM_CONTROLCHANGE消息的流向,可以较好的 测试代码: procedure TForm1.Button1Click(Sender: TObject);var Image2 : TIma ...