by lostfire
最近一直试图用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,上传文件问题:
posted on 2006-06-15 00:12
rd2pm 阅读(9573)
评论(12) 编辑 收藏 所属分类:
http tool