csdn博客客户端开发日记----2015年7月22日

来源:互联网 发布:苏州相城区淘宝培训 编辑:程序博客网 时间:2024/06/08 01:07

最近在csdn博客上发现了很多好的文章,找了很多博客导出工具都弄不下来,恰好最近手上没什么事,就想着做一个csdn博客的app。


csdn上也有前辈已经做过博客的app了,我看了下好像只支持专家博客的,对于一般人的好像并不支持查看。原来在学校的时候做过一个查课表的app,虽然是失败了,不过也知道一些网页爬虫的工具,比如httpwatch,htmlpaser等等。工作一年之后,感觉经验比之前要好很多了,所以还是决定这一次试试做个csdn博客app出来。


说是这么说,我也不知道最后有没有耐心坚持做完,但是还是开个头吧,不开个头后面的事情就更难说了。


说了这么多,是为了交代下背景,也是为了激励下自己,加油~~


2015年7月22日

好久没有用HttpClient了,所以对它的用法已经忘得差不多了,这也是我想做这个app的原因之一,因为做项目大概就是查漏补缺、丰富经验的过程吧。


一系列的百度和coding之后,碰到的第一个问题是乱码的问题。


一开始我是用下面的方式,然后将读出来的字节数组用new String(data,"utf-8")的方式保存,但是debug的时候发现new出来的字符串是乱码。


百度后看到有人说不应该用字节流,应该用字符流。


/** * 从输入流中读取数据 *  * @param inStream * @return * @throws Exception */public static byte[] readInputStream(InputStream inStream) throws Exception {ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outStream.write(buffer, 0, len);}byte[] data = outStream.toByteArray();// 网页的二进制数据outStream.close();inStream.close();return data;}



于是我又写了一种方式,但是还是乱码。百思不得其解。


/** * 从输入流中读取数据 *  * @param inStream * @return * @throws Exception */public static String read(InputStream inStream) throws Exception {InputStreamReader inputStreamReader = new InputStreamReader(inStream,HTTP.UTF_8);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);StringBuilder stringBuilder = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {stringBuilder.append(temp);}bufferedReader.close();inputStreamReader.close();return stringBuilder.toString();}


问了很多人,有人说要我多试几种不同的编码,但是我试了之后发现并没有什么卵用。而且我用httpwatch查看的时候,响应头里面的字符集是utf-8的。


后来我在网上找到了有前辈做的csdn博客app,看了下他的代码,对比了下自己的,发现自己请求的时候加了很多请求头。


addHeader("Accept", "text/html, application/xhtml+xml, */*");addHeader("Accept-Encoding", "gzip, deflate, sdch");addHeader("Accept-Language", "zh-CN,zh;q=0.8");addHeader("Connection", "Keep-Alive");addHeader("Host", "blog.csdn.net");addHeader("UA-CPU", "AMD64");addHeader("User-Agent","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)");

看上面的请求头,大多都是硬件信息,浏览器标识之类的,只有这两句,第一句是我不知道,第二句是跟中文有关的,然后把它们都注释掉。

<span style="white-space:pre"></span>addHeader("Accept-Encoding", "gzip, deflate, sdch");addHeader("Accept-Language", "zh-CN,zh;q=0.8");

再次请求,发现得到的数据没有乱码了!!!


查了下百科:HTTP Header中Accept-Encoding 是浏览器发给服务器,声明浏览器支持的编码类型


书到用时方恨少啊,早知道在学校好好念书了。


后来发现把上面那句改成


addHeader("Accept-Encoding", "utf-8");


就好了。


另外,将响应实体转成字符串不用那么麻烦,之前是用这个response.getEntity().getContent() 得到输入流,然后从输入流读到字符串。


但是后来看那位前辈的代码,发现只要一句就可以了EntityUtils.toString(entity)。


这是那位前辈的博客

over.

0 0