看到fins大牛写的JE talker以后,很有冲动自己也来写一下。我的UI设计还很差,还是先实现命令行的吧!
我是采用HttpClient模拟get请求来获取数据,再用jsonlib解析数据。
开始以为不难实现,不料开始就给我来了一个下马威!Http验证通不过,java eye api 验证采用的是HTTP Basic Access Authentication,最常用也是最简单的http验证。通过wiki查看了一下原来就是把"username:password"经过Base64加密后,放在header中。当服务器接受请求后,再利用Base64Decode进行验证,不成功则返回httpcode为401。开始我怀疑是不是httpclient采用是不是basic验证。通过查看文档以后,httpclient默认优先采用basic验证。javaeye采用的是basic验证,http优先使用的也是basic验证,而程序死活儿不能通过验证,太奇怪了!
从http://ssword.yo2.cn/2009/01/29/ruby%E4%BD%BF%E7%94%A8open-uri%E5%81%9Ahttp-basic%E9%AA%8C%E8%AF%81/中看到ruby的basic验证
require 'open-uri' require 'base64' f = open(url,"Authorization"=>"Basic #{Base64.b64encode("myaccount:mypassword")}") puts f.read
首先向大家道个谦:
java和ruby的BASE64编码算法得到的结果是一样的
现在的问题是这样的:
DefaultHttpClient httpclient = new DefaultHttpClient(); httpclient.getCredentialsProvider().setCredentials( AuthScope.ANY, new UsernamePasswordCredentials("user", "password")); // CredentialsProvider provider = new BasicCredentialsProvider(); // provider.setCredentials(new AuthScope("http://api.iteye.com/api/twitters/replies",80), new UsernamePasswordCredentials("user:password")); HttpGet httpget = new HttpGet("http://api.iteye.com/api/twitters/replies");
这样是通不过验证的
提示:
警告: Authentication error: Unable to respond to any of these challenges: {}
----------------------------------------
HTTP/1.1 401 Unauthorized
Response content length: 15
采用httpclient3
client.getState().setCredentials( AuthScope.ANY, new UsernamePasswordCredentials("user", "password") );
也通不过 提示:
<div style="padding:10px 10px"> <p>您可能使用了网络爬虫抓取JavaEye网站页面!</p> <p>JavaEye网站不允许您使用网络爬虫对JavaEye进行恶意的网页抓取,请您立刻停止该抓取行为!</p> <p>如果您的网络爬虫不属于恶意抓取行为,希望JavaEye网站允许你进行网页抓取,请和JavaEye管理员联系,取得授权: webmaster AT javaeye DOT com</p> <p>如果您确实使用浏览器访问,但是被错误的识别为网络爬虫,希望将您浏览器发送的“User Agent”信息告知我们,帮助我们解决错误: webmaster AT javaeye DOT com</p> </div>
只有当把验证串放在header中才能通过
我对httpclient的验证了解不多,恳请高手帮我分析一下