最近在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.youkuaiyun.com");
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() 得到输入流,然后从输入流读到字符串。
over.