最近一直试图用httpClient做点自动化的工作,不过现在看来并没有想象中的那么轻松。

实际上登录一个网站,访问某个特点的页面,发表一篇文章,上传一些文件,并不是一个简单的事情。
HttpClient的基本使用因为发布的代码中带有几个例子,应该算是不难掌握的事情。下面我说下我遇到的几个问题。

1,登陆验证图片问题
首先登录的时候网站如果不想你对它编程的化通常都会设计一个验证图片,这个技术现在已经如此的易于使用,以至于随便到哪里都能找到代码来直接使用。对于验证图片的,现在还苦于无计可施状态。

2,笨蛋Cookie问题:
如果你要发送多个cookie,其实可以这样发的:

state.addCookies (new Cookie[]{
            new Cookie(" www.aaa.com","popped","yes","/",new Date(2006,12,8),false), 
            new Cookie(" www.aaa.com","rtime","2","/",new Date(2006,12,8),false), 
            new Cookie(" www.aaa.com","ltime","1149940477953","/",new Date(2006,12,8),false), 
            new Cookie(" www.aaa.com ","cnzz02","1","/",new Date(2006,12,8),false),
        });

但是截包就会发现,httpclient会在header里构件多个cookie项,每一项只含有一个cookie,这同IE是不一样的。IE和Firefox会把所有的cookie打包成一个,然后在这个cookie里按照分号把每一项隔开,中间有个空格。 
所以如果用httpclient,还想让cookie正常的话,请使用下面这种形式:

String cookies = "yes; rtime=2; ltime=1149940477953; cnzz02=1"; 
state.addCookie(new Cookie("blog.aaa.com","poped",cookies,"/",new Date(2006,12,8),false)); 

3,编码问题:

httpClient处理编码并不像IE或FireFox那么智能,httpclient记不住上次会话的编码,这样如果默认不是ISO-8859-1的话,那都要在Content-Type里边指定,其实指定的方法也很简单。 
本来要提交的是form,默认按照application/x-www-form-urlencoded来发送,在IE里边发送的话截包可以看到,报文中也就指定了这样一个Content-Type,但是人家IE已经把报文的内容按照会话的编码转换好了。而httpclient不行,它并不知道怎么转化,那么你没有设定转换的charset的话,它就按照Charset=ISO-8859-1转换了。这一点上Httpclient应该再改进一下,因为记住server发过来的页面编码是件很简单的事情。只要将类似于"Content-Type: text/html; charset=utf-8"这样的头保存一下状态就可以了。 
为了弥补httpclient这一点的傻瓜表现,我们只好每次都手工设置一下喽:
postMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");


4,上传文件问题:
httpClient并不能很好的模拟文件上传。
首先是对于文件类型的识别,IE可以做到按照文件类型分别选择不同的Content-type进行发送,而httpclient就需要我们自己设定,这样如果对一个目录进行自动化上传的话就必须知道该目录下所有文件的类型,以及对应的charset,然后再设置FilePart的时候逐一判断文件扩展名,以赋给不同的content-type和charset,对于一些网页编码是gb2312,而另外一些网页编码是utf-8则会更加麻烦。 
其次是如果发送的multiPartPost报文中除了FilePart以外,还需要一些form中的其他input的信息,又是一件很麻烦的事情。刚开始的时候我以为像一般的PostMethod一样,使用PostMethod.addParameters()就可以了,后来才发现这个 MultiPartPost跟那个Post根本就是两个不同的Post。虽然从网页上看都是Form,且只是在input的类型上 MultiPartPost包含一个file类型的input,其他完全一样,但实际上在httpClient中是完全不同的两套方案。对于MultiPartPost而言,不能用addParameters(),而要使用

someMultiPartPost.setRequestEntity(
     new MultipartRequestEntity( 
         new Part[] { art1,part2,part3,part4}, 
                    someMultiPartPost.getParams())
);

这种形式。对于要上传的File,那么这些part就是FilePart对象,如果是跟随form的其他input,那么这些part就是 StringPart。这样发出去的报文才是:Content-Disposition: form-data; name="newFolderName"这种形式。

总结起来,其实也不能怪人家HttpClient,天下间哪有那么多容易做到的事情,尤其是面对Http这样一个说来不算简单的协议。
实际上像这种开源已久的东西,已经有了不少的文档,虽然有时候不太好找,但很多问题还是能够猜或者试出来,毕竟相对比较成熟,而且遵循这rfc来做的。就像我在水母上问问题,有人说的那样,世界上有什么能模拟的像IE一样呢,也不能拿IE的标准要求HttpClient。
我现在的感觉是要想用好HttpClient,或者类似的别的什么工具(其他我就不知道了,有知道类似工具的麻烦告诉我一声),其实还是要把协议吃透,这样一旦遇到什么问题,才知道问题出在哪里,否则就只有郁闷的份儿了。
昨天去Apache的网站,看到一个新的Project叫做HttpComponent从common里边脱离出来,包含了HttpCore, HttpClient,HttpAsync,HttpNIO,HttpCookie,HttpConn,看不出到底想做成什么样子,不过HttpCore 4.0 alpha2已经发布了,以后HttpClient用起来可能又有新的变化了。

一周的时间,用的不是很多,有说得不妥的地方,还请大家指正

本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2007/01/23/627614.html如需转载请自行联系原作者
kenty

httpClient学习的初步认识相关推荐

  1. HttpClient学习

    HttpClient学习 (1)下面列举几个主要的Http相关概念的类 类名 描述 HttpClient 建立请求客户端 HttpGet 代表请求方法,类似的还有HttpHead, HttpPost, ...

  2. HttpClient 学习整理

    HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴.在网上整理了一些东西,写得很好,寄放在这里 ...

  3. Spring源码学习的初步体会

    Spring源码学习的初步体会: 深入学习和巩固java的基础知识,其中的java知识范围全部,可以边研究源码边巩固复习基础知识 体会其中用到的设计思想:其中包含的设计原则和设计模式. 加深对spri ...

  4. HttpClient 学习整理(转)

    来自 http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的 ...

  5. 大型机学习之初步了解-大型机的现状与前景

    大型机学习之初步了解-大型机的现状与前景 关于大型机的现状和前景,据我的一点小小的所知首先就是IBM仍在开发和维护它的那一系列机器,并在拿它不停地赚钱.但是业界对于大型机的存在有两种声音,一种就是互联 ...

  6. 申请深造计算机专业的理由,申请理由和到境外留学期间学习的初步计划.doc

    申请理由和到境外留学期间学习的初步计划 申请理由和到境外留学期间学习的初步计划 申请理由和到境外留学期间学习的初步计划 第一篇_出国留学学习计划书 出国留学学习计划书 一,既给大使馆申请出国证件用的 ...

  7. httpclient 学习

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基 ...

  8. 超表面学习一 初步印象

    超表面学习中 第一章 初步认识 一.传统超表面 1.吸波 2.反射相位 3.透射相位 4.电磁带隙 引申出来的超表面基础应用: 1.透波透镜(对应透射相位) 分为近场和远场 近场:贝塞尔波束等等 远场 ...

  9. 第一篇博客(关于IT学习的初步想法)

    目录 一.个人介绍 二.编程目标 三.如何学习编程 四.每周投入时间 五.最想进入的IT公司 六.总结 一.个人介绍 我是一名大一学生,目前就读计算机相关专业.想做的事有很多,但现在自己能力有限,希望 ...

最新文章

  1. STP:五种端口状态与角色 RSTP:3种端口状态与角色
  2. 双十一,单身狗除了买买买,还能做什么?
  3. 一文让你秒懂各种进制的前缀
  4. boost 获取日期时间
  5. 计算机农业应用与3S技术论文,3S技术在精细农业中的应用实例分析
  6. java 文档比较功能_java 实现在线比较两个版本的Word文档的功能
  7. springboot整合jpa之Specification
  8. 我的java语法基础篇刷题2
  9. 格力手机2 官方固件_ROG游戏手机2备货不足,官方发表致歉信
  10. layui 新手实例教程
  11. 孙悟空在大闹蟠桃园的时候,第一天吃掉了所有桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。第一天开始吃的时候一共有多少个
  12. 程序员面试系列(2)非计算机专业程序员
  13. Android源码目录结构-4.0
  14. 逝者:Django贡献最多的核心开发者Malcolm Tredinnick
  15. mysql创建数据库error1044_Mysql创建数据库时提示Error 1044
  16. 集成灶哪个品牌质量好(六款热销集成灶对比测评)
  17. scratch——这个电路仿真工具真不错
  18. VS F12键失效怎么办?
  19. linux容器内核配置,如何在Linux内核Centos下使用Sentinel LDK保护Docker容器实例
  20. 新版Chrome自动禁用第三方插件的解决办法[转]

热门文章

  1. UA OPTI570 量子力学26 无自旋的氢原子
  2. LASSO与Item Response Theory模型中的隐变量选择
  3. UA MATH566 统计理论 用点估计构造置信区间
  4. 如何在Win7以上环境使用VC++6
  5. 在docker镜像中加入环境变量
  6. POJ 3177 Redundant Paths (边双连通+缩点)
  7. java应用高内存占用
  8. 鼠标移到某一行 某一行变色 鼠标移开恢复
  9. java基础篇7----java.util中的Scanner类的使用
  10. Extjs--FormPanel(2)