一步步教你为网站开发Android客户端
am页面里面有Host地址 端口是80 client.getHostConfiguration().setHost(http://coin.lib.scuec.edu.cn, 80); //用目标地址 实例一个POST方法 PostMethod post = new PostMethod(http://coin.lib.scuec.edu.cn/cgi-bin/IlaswebBib); //将需要的键值对写出来 NameValuePair beg = new NameValuePair(FLD_DAT_BEG , “”); NameValuePair end = new NameValuePair(FLD_DAT_END , “”); NameValuePair submit = new NameValuePair(submit , 查询)); NameValuePair vIndex = new NameValuePair(v_index , “TITLE”); NameValuePair vLogicSrch = new NameValuePair(v_LogicSrch , 0); NameValuePair vPagenum = new NameValuePair(v_pagenum , 10); NameValuePair vSeldatabase = new NameValuePair(v_seldatabase , 0); NameValuePair vValue = new NameValuePair(v_value ,”android”); //给POST方法加入上述键值对 post.setRequestBody(new NameValuePair[] {beg , end , submit , vIndex , vLogicSrch , vPagenum , vSeldatabase , vValue}); //执行POST方法 client.executeMethod(post); //将POST返回的数据以流的形式读入,再把输入流流至一个buff缓冲字节数组 //StreamTool类是我自己写的一个工具类,其内容将在下文附出 byte[] buff = StreamTool.readInputStream(post.getResponseBodyAsStream()); //将返回的内容格式化为String存在html中 String html = new String(buff); //任务完成了,释放连接 post.releaseConnection(); //StreamTool类如下 public class StreamTool { /** * 从输入流中获取数据 * @param inputStream 输入流 * @return 字节数组 * @throws Exception */ public static byte[] readInputStream(InputStream inputStream) throws Exception { //实例化一个输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //一个1024字节的缓冲字节数组 byte[] buffer = new byte[1024]; int len = 0; //读流的基本知识 while ((len=inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } //用完要关,大家都懂的 inputStream.close(); return outputStream.toByteArray(); } } 现在,我们得到了POST方法返回的String,我们输出到控制台看看是什么 System.out.println(html); 没错,就是我们上文看到的HttpWatch 抓到的返回Content,也就是一段HTML代码,这说明,我们模拟浏览器POST请求成功了! 我们再试试别的搜索内容,来一个”android开发”(即将v_value键值对的值改成”android开发”),这时运行后,我们却从控制台得到了这样的结果: 经过几次试验后,发现一个规律,只要搜索内容中包括中文,就搜不到。 所以可以判定是中文编码的问题,(在开发这类客户端时候,中文编码往往是个很具困难的问题。安卓巴士开发3群的某群友提到:服务器交流用的编码是”ISO-8859-1”,跟我起初用到的编码一致,但真实性仍需考证)所以我们修改上面的代码,将代表搜索内容的v_value对应的值编码为”ISO-8859-1” 就将上段代码中的 NameValuePair vValue = new NameValuePair(v_value ,”android”); 改为 NameValuePair vValue = new NameValuePair(v_value , new String(“android开发”.getBytes(),ISO-8859-1)); 这时再运行,控制台成功输出以” android开发”为关键字的Content。 至此,我们POST请求才真正完成。 观察控制台的HTML后发现,我们需要的书目信息就在里面,只不过被一些HTML标签包裹住了,下一步我们就要解放这些信息,存储到容器里。 这里我们要用到Jsoup,一个Java开源HTML解析器(来自org.jsoup包)。 我们直接上代码,逐行解释(大家最好对应上面的HTML代码来理解) 首先我们建一个容器来装这些解析到的数据,由于我的项目是将这些数据以ListView呈现给用户,而ListView的数据是由Adapter提供,Adapter需要传一个特殊容器-包含HashMap的ArrayList(Android基础知识) //所以有 List //开始使用Jsoup //Jsoup支援一个Document类 将刚才的html转化成Document Document document = Jsoup.parse(html); //一个Document又由elements组成 我们选择”tr”开头的标签,存入 trs元素群中 Elements trs = document.select(tr); //得到整个HTML中包含tr的标签的个数 int totalTrs = trs.size(); //我们可以观察上面没有搜索结果的那
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)