没有接口的情况下开发手机客户端

最近一个开发项目用到了图书馆的一些数据,图书馆用的系统又没提供数据接口,所以老规矩,用HttpClient和Jsoup这两大开源工程上,用Android手机来模拟图书馆查询的请求与响应,
网站是学校的图书馆网:lib.gdou.edu.cn
第一步:分析并模拟网站的请求与响应
工具就不用介绍了,百度一大把,有些浏览器还自带,按一下你的F12,看有没有?~_~

首先是搜索的页面的分析,其他的同理:

输入关键字后得到,在后台扑获的数据为

[html] view
plain
copy

  1. Request URL:http://210.38.138.1:81/search.aspx  
  2. Request Method:POST  
  3. Status Code:302 Found  
  4. <font color="\"#ff0000\"">Request Headersview source            //http请求头部分</font>  
  5. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
  6. Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3  
  7. Accept-Encoding:gzip,deflate,sdch  
  8. Accept-Language:zh-CN,zh;q=0.8  
  9. Cache-Control:max-age=0  
  10. Connection:keep-alive  
  11. Content-Length:5273  
  12. Content-Type:application/x-www-form-urlencoded  
  13. Cookie:ASP.NET_SessionId=sls3z2f2bux2mbbmin5hiv55; sulcmiswebpac=B0A84B140CE5D6A7A4E6FCBC672F3C68117288906D6A6FB1391C78220BFDE5F884CF686A3C2AB0933C93CB6237BA2A0281BE8A2EA3D43775BF0C7E718904A5385EB7CA5C3CD7375266E20498A647065205DF37BE7C48B395AC7A6D8E22DFFC06  
  14. Host:210.38.138.1:81  
  15. Origin:http://210.38.138.1:81/search.aspx  
  16. User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11  
  17. <font color="\"#ff0000\"">Form Dataview URL encoded         //用post提交的表单数据</font>  
  18. __VIEWSTATE:                        //这里一长串的数据被我省略了,要看自己抓一下就可以了,这串没弄明白是提交上去干什么的,不知是不是用来保存数据的,等高手解释吧  
  19. ctl00$ContentPlaceHolder1$splb:ANYWORDS  
  20. ctl00$ContentPlaceHolder1$keywordstb:java  
  21. ctl00$ContentPlaceHolder1$searchbtn:快速检索  
  22. ctl00$ContentPlaceHolder1$deptddl:ALL  
  23. ctl00$ContentPlaceHolder1$depthf:ALL  
  24. <font color="\"#ff0000\"">Response Headersview source           //http响应的数据</font>  
  25. Cache-Control:private  
  26. Content-Length:243  
  27. Content-Type:text/html; charset=utf-8  
  28. Date:Mon, 25 Jun 2012 02:20:34 GMT  
  29. Location:/searchresult.aspx?anywords=java&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL             
  30.   //302重定向到这个http里,所以要提交查找图书,直生成这个URI就行了,然后提交到服务器上面,就可以省去前面的请求与响应了  
  31. PSP:CP=CAO PSA OUR  
  32. Server:Microsoft-IIS/6.0  
  33. X-AspNet-Version:2.0.50727  
  34. X-Powered-By:ASP.NET  

URi的生成代码部分与请求:

[html] view
plain
copy

  1. public List<SearchBook> searchBook(String method, String word, int page) {  
  2.                 this.method = method;  
  3.                 this.word = word;  
  4.                 HttpClient client = new DefaultHttpClient();  
  5.                 List<NameValuePair> qparams = new ArrayList<NameValuePair>();  
  6.                 qparams.add(new BasicNameValuePair(method, word));  
  7.                 qparams.add(new BasicNameValuePair("dt", "ALL"));           //这些可以自己到网页上看一下代表什么  
  8.                 qparams.add(new BasicNameValuePair("cl", "ALL"));  
  9.                 qparams.add(new BasicNameValuePair("dp", "20"));  
  10.                 qparams.add(new BasicNameValuePair("sf", "M_PUB_YEAR"));  
  11.                 qparams.add(new BasicNameValuePair("ob", "DESC"));  
  12.                 qparams.add(new BasicNameValuePair("sm", "table"));  
  13.                 qparams.add(new BasicNameValuePair("dept", "ALL"));  
  14.                 qparams.add(new BasicNameValuePair("page", page + ""));  
  15.                 URI uri;  
  16.    
  17.                 try {  
  18.                         uri = URIUtils.createURI("http", "210.38.138.1:81", -1,  
  19.                                         "/searchresult.aspx",  
  20.                                         URLEncodedUtils.format(qparams, "GBK"), null);  
  21.                         HttpGet httpget = new HttpGet(uri);  
  22.                         System.out.println(httpget.getURI());  
  23.                         addHttpGetHeader(httpget);  
  24.                         HttpResponse response = client.execute(httpget);  
  25.                         HttpEntity entity = response.getEntity();  
  26.                         // System.out.println(EntityUtils.toString(entity));  
  27.                         return JsoupUtils.getSearchBook(EntityUtils.toString(entity));          //拿到请求回来的html数据到JsopUtils包里面去解释,得到想要的数据  
  28.                 } catch (ClientProtocolException e) {  
  29.                         e.printStackTrace();  
  30.                 } catch (ParseException e) {  
  31.                         e.printStackTrace();  
  32.                 } catch (URISyntaxException e) {  
  33.                         e.printStackTrace();  
  34.                 } catch (IOException e) {  
  35.                         e.printStackTrace();  
  36.                 }  
  37.                 return null;  
  38.         }  

生成后的变成:
[url=http://210.38.138.1:81/searchresult.aspx?anywords=java&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL]http://210.38.138.1:81/searchresult.aspx?anywords=搜的关键字&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL 
在上面拿到Html响应后进入到Joup包里去解释,得到想要的图书条目
Joup里的代码部分:

[html] view
plain
copy

  1. //解释搜书,使用Joup  
  2.                 public static List<SearchBook> getSearchBook(String html){  
  3.                         List<SearchBook> list=new ArrayList<SearchBook>();  
  4.                         Document doc=Jsoup.parse(html);  
  5.                         searchNumber=Integer.parseInt(doc.getElementById("ctl00_ContentPlaceHolder1_countlbl").text());//查找Html标签,得到特定内容  
  6.                         if(searchNumber==0){  
  7.                                 return null;  
  8.                         }  
  9.                         Elements es=doc.getElementsByClass("tb").get(0).getElementsByTag("tr");      //得到表单的数据,遍历到一个类的对象中,用一个List来保存类对象,有用过jsoup都认识这个用法,不清楚去百度一下  
  10.                         for(int i=1;i<es.size();i++){  
  11.                                 SearchBook book=new SearchBook();  
  12.                                 Elements tdes= es.get(i).getElementsByTag("td");  
  13.                                 for(int j=0;j<tdes.size();j++){  
  14.                                         switch (j) {  
  15.                                         case 0:  
  16.                                                 book.setSystemnumber(tdes.get(j).getElementsByTag("input").attr("value"));  
  17.                                                 break;  
  18.                                         case 1:  
  19.                                                 book.setName(tdes.get(j).text().trim());  
  20.                                                 break;  
  21.                                         case 2:  
  22.                                                 book.setWriter(tdes.get(j).text().trim());  
  23.                                                 break;  
  24.                                         case 3:  
  25.                                                 book.setPublish(tdes.get(j).text().trim());  
  26.                                                 break;  
  27.                                         case 4:  
  28.                                                 book.setDate(tdes.get(j).text().trim());  
  29.                                                 break;  
  30.                                         case 5:  
  31.                                                 book.setSearchnumber(tdes.get(j).text().trim());  
  32.                                                 break;  
  33.                                         case 6:  
  34.                                                 book.setMax(tdes.get(j).text().trim());  
  35.                                                 break;  
  36.                                         case 7:  
  37.                                                 book.setMin(tdes.get(j).text().trim());  
  38.                                                 break;  
  39.                                         default:  
  40.                                                 break;  
  41.                                         }  
  42.                                 }  
  43.                                 list.add(book);  
  44.                                 System.out.println(book);  
  45.                         }  
  46.                         return list;  
  47.                 }  

第二步就进行数据的显示与布局
这里由于自己做一个布局的话一费时,二来我与不太会做界面,所以直接拿开源工程饭否的界面,改了一下就用上。请高手见谅。。。
这步重点是ListView的用法与异步的使用
代码比较多,我就不贴了,自己找代码看下

软件运行界面:

这些功能都可以对映到网页上的功能

总结:
个人觉得是搜索功能是完成的比较完全的,在详细图书查看本来是想做一个图书图片查看的和内容,可惜图书的图片不是图书管理系统里,抓图有点不方便,内容和目录又合在一起,显示非常乱,这个网页做得太差了,所以没去抓下来,只抓了有用的藏书地点,修改密码的功能与说一下,存在的问题就是修改成功与失败都返回同一个状态号,所以软件判断不了修改结果。只能自己重登陆试下。
最后,说下搜索功能是不需要登陆的

源码包地址:http://www.eoeandroid.com/thread-180939-1-1.html

时间: 2024-10-31 23:02:15

没有接口的情况下开发手机客户端的相关文章

技术-在没有PC网站接口的情况下实现数据输入读取并得到返回结果显示在手机网站上,

问题描述 在没有PC网站接口的情况下实现数据输入读取并得到返回结果显示在手机网站上, 我想在手机端输入手机号和其他身份信息就可以连接PC段网站得到返回数据信息并显示在手机网页上,中间需要什么技术和具体步骤,有大神帮忙分析下吗?希望有经验的大神可以帮我解决这个难题,如果方便的话发我邮箱:408150057@qq.com 解决方案 手机上就是一个客户端,然后网站做服务端,提供一个web API 手机发送ajax请求得到返回的数据.一般用json格式

嵌入式 物联网-物联网开发android手机客户端问题。

问题描述 物联网开发android手机客户端问题. 以下是关于物联网开发手机客户端的问题 1,应该怎么实现手机a,b连接到同一个wifi下,手机a通过手机b的ip地址给b发送一条数据. 我测试了下,通过一部手机作为服务器端socketServer,另一部手机作为客户端socket.客户端通过服务器端从wifiInfo中获取自己的ip地址发送一条数据给服务器端,没有成功接收到信息. 2,如果当不知道手机b的ip信息情况下,手机a可以从连接上的wifi去获取手机b的ip吗? 解决方案 做服务器注册a

使用ASP.NET Futures开发以客户端为中心的Ajax应用

1 以客户端为中心的Ajax应用 在进行Ajax应用开发的之前,通常我们首先要考虑一个问题,那就是此应用到底以客户端为中心还是以服务器端为中心.什么情况下应该以客户端为中心,而什么情况下应该以服务器端为中心呢?要回答这个问题首先我们要来看看它们各自的一些例子. 我们所见到的一部分Ajax网站,它们和非Ajax网站的结构是类似的,也就是由多个页面组成,一般一个视图就是一个页面,与非Ajax网站不同的地方仅在于引入了与服务器端的后台通信,而且这些通信逻辑通常仅服务于页面上一个局部的区域.例如一个社区

关机状态下,手机流量仍然莫名丢失

核心提示:明明记得在睡前把手机关了,为何白天开机后竟然得知耗费了350MB(兆)流量?近期,不断有智能手机用户反映关于手机"跑流量"的怪异事件.昨天下午,河南省联通公司市场销售部业务主管张涛应记者之邀,为市民分析几种常见的"跑流量"原因. 怪象1 关机状态下,手机流量仍然莫名丢失 求解:"求高手支招,四凤(iphone4)为啥处于关机状态下还是跑流量!"昨日,在媒体工作的路女士向同事发出求助信号,前一天,她的苹果手机睡前关机了,但次日开机后发现,

Android手机灭屏的情况下,自己开发的聊天工具如何接受信息提示

问题描述 Android手机灭屏的情况下,自己开发的聊天工具如何接受信息提示 现在的手机厂商都会做深度优化功能,在手机灭屏的时候,第三方的应用会被挂起或者是kill掉. 目前自己做了一个即时通讯聊天的Android App,但是在华为手机上灭屏的时候进程就被挂起了,这样就无法接受到别人发送过来的信息.想请问下大神们有没有什么好的处理方式,让程序在手机灭屏的时候每隔一段时间唤醒一次. 我看华为的手机设置里会为微信支付宝等应用提供定时唤醒的功能,第三方其他应用就没有提供这个定时唤醒的功能.不知道对于

was集群下基于接口分布式架构和开发经验谈

   某b项目是我首次采用was环境下架构和开发的手机wap应用,尽管做到了该项目的主程,但对此项目的全面构件依然有不清楚的地方,因此在这里我只能简单的谈谈开发中遇到的问题怎么处理和应对办法.          记得第一天接触这个项目时,只记得些案例代码(不知道那些是对的,那些是错的)似曾相识,但不懂如何动手写下第一个helloword,因其中的基于接口开发的ejb的架构以前根本就没接触过.好了,没办法,于是只有硬着头皮去尝试第一个基于接口开发的ejb的第一个查询方法(呵呵最简单了吧).因为一切

EzVPN客户端在服务器侧没有配置隧道分离的情况下如何直接上公网

一.概述: 很多情况下,为了安全,避免一边拨入公司内网,又同时上互联网的情况,EzVPN服务端没有配置隧道分离.但是如果想要这样,而总部侧的设备又没有权限修改怎么办?下面分别以EzVPN硬件客户端和软件客户端来介绍. 测试拓扑参照:http://333234.blog.51cto.com/323234/1202965. 其实EzVPN客户端的解决方法跟上面的类似,但是EzVPN软件客户端通过删除默认路由的方式没有测试成功,PPTP VPN和L2TP IpSEC VPN这种方式是可行的. 二.Ez

android-java web 怎么给安卓手机客户端提供接口? 开发文档不懂 跪求解决方法

问题描述 java web 怎么给安卓手机客户端提供接口? 开发文档不懂 跪求解决方法 用到的框架 spring+springMVC+myBatis 数据库 mysql 开发工具 eclipse 实现手机 注册 和登录 以及获取手机用户个人信息功能 这是开发文档 可供参考,真的不知道该从哪里入手 1.用户注册 参数名称 参数说明 长度要求 可选/必须 phone 用户注册的手机号 必须 password 用户密码(md5加密) 必须 code 手机验证码 6 必须 rndstring 随机字符串

spring mvc-java怎么样为手机客户端提供接口? 我用的springMVC框架

问题描述 java怎么样为手机客户端提供接口? 我用的springMVC框架 用到的框架 spring +springmvc+mybatis 数据库 mysql 开发工具 eclipse 写一个手机注册和登录的功能 跪求 解决方法 具体该怎么操作呀 框架都搭建好了管理员的基本增删改查分页查询都弄好了 手机注册和登录这个模块 解决方案 就用 springmvc写 rest 接口就可以了,前后台技术无关 解决方案二: web service + ssh + eclipse 很简单