開發網站客戶端第二彈


最近一個開發項目用到了圖書館的一些數據,圖書館用的系統又沒提供數據接口,所以老規矩,用HttpClient和Jsoup這兩大開源工程上,用Android手機來模擬圖書館查詢的請求與響應,
網站是學校的圖書館網:lib.gdou.edu.cn
第一步:分析並模擬網站的請求與響應
工具就不用介紹了,百度一大把,有些瀏覽器還自帶,按一下你的F12,看有沒有?~_~
首先是搜索的頁面的分析,其他的同理:

輸入關鍵字后得到,在后台撲獲的數據為

Request URL:http://210.38.138.1:81/search.aspx
Request Method:POST
Status Code:302 Found
<font color="#00f000">Request Headersview source            //http請求頭部分</font>
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:5273
Content-Type:application/x-www-form-urlencoded
Cookie:ASP.NET_SessionId=sls3z2f2bux2mbbmin5hiv55; sulcmiswebpac=B0A84B140CE5D6A7A4E6FCBC672F3C68117288906D6A6FB1391C78220BFDE5F884CF686A3C2AB0933C93CB6237BA2A0281BE8A2EA3D43775BF0C7E718904A5385EB7CA5C3CD7375266E20498A647065205DF37BE7C48B395AC7A6D8E22DFFC06
Host:210.38.138.1:81
Origin:http://210.38.138.1:81/search.aspx
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11
<font color="#00f000">Form Dataview URL encoded         //用post提交的表單數據</font>
__VIEWSTATE:                        //這里一長串的數據被我省略了,要看自己抓一下就可以了,這串沒弄明白是提交上去干什么的,不知是不是用來保存數據的,等高手解釋吧
ctl00$ContentPlaceHolder1$splb:ANYWORDS
ctl00$ContentPlaceHolder1$keywordstb:java
ctl00$ContentPlaceHolder1$searchbtn:快速檢索
ctl00$ContentPlaceHolder1$deptddl:ALL
ctl00$ContentPlaceHolder1$depthf:ALL
<font color="#00f000">Response Headersview source           //http響應的數據</font>
Cache-Control:private
Content-Length:243
Content-Type:text/html; charset=utf-8
Date:Mon, 25 Jun 2012 02:20:34 GMT
Location:/searchresult.aspx?anywords=java&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL           
  //302重定向到這個http里,所以要提交查找圖書,直生成這個URI就行了,然后提交到服務器上面,就可以省去前面的請求與響應了
PSP:CP=CAO PSA OUR
Server:Microsoft-IIS/6.0
X-AspNet-Version:2.0.50727
X-Powered-By:ASP.NET

URi的生成代碼部分與請求:

public List<SearchBook> searchBook(String method, String word, int page) {
                this.method = method;
                this.word = word;
                HttpClient client = new DefaultHttpClient();
                List<NameValuePair> qparams = new ArrayList<NameValuePair>();
                qparams.add(new BasicNameValuePair(method, word));
                qparams.add(new BasicNameValuePair("dt", "ALL"));           //這些可以自己到網頁上看一下代表什么
                qparams.add(new BasicNameValuePair("cl", "ALL"));
                qparams.add(new BasicNameValuePair("dp", "20"));
                qparams.add(new BasicNameValuePair("sf", "M_PUB_YEAR"));
                qparams.add(new BasicNameValuePair("ob", "DESC"));
                qparams.add(new BasicNameValuePair("sm", "table"));
                qparams.add(new BasicNameValuePair("dept", "ALL"));
                qparams.add(new BasicNameValuePair("page", page + ""));
                URI uri;
 
                try {
                        uri = URIUtils.createURI("http", "210.38.138.1:81", -1,
                                        "/searchresult.aspx",
                                        URLEncodedUtils.format(qparams, "GBK"), null);
                        HttpGet httpget = new HttpGet(uri);
                        System.out.println(httpget.getURI());
                        addHttpGetHeader(httpget);
                        HttpResponse response = client.execute(httpget);
                        HttpEntity entity = response.getEntity();
                        // System.out.println(EntityUtils.toString(entity));
                        return JsoupUtils.getSearchBook(EntityUtils.toString(entity));          //拿到請求回來的html數據到JsopUtils包里面去解釋,得到想要的數據
                } catch (ClientProtocolException e) {
                        e.printStackTrace();
                } catch (ParseException e) {
                        e.printStackTrace();
                } catch (URISyntaxException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return null;
        }

生成后的變成:
[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里的代碼部分:

//解釋搜書,使用Joup
                public static List<SearchBook> getSearchBook(String html){
                        List<SearchBook> list=new ArrayList<SearchBook>();
                        Document doc=Jsoup.parse(html);
                        searchNumber=Integer.parseInt(doc.getElementById("ctl00_ContentPlaceHolder1_countlbl").text());//查找Html標簽,得到特定內容
                        if(searchNumber==0){
                                return null;
                        }
                        Elements es=doc.getElementsByClass("tb").get(0).getElementsByTag("tr");      //得到表單的數據,遍歷到一個類的對象中,用一個List來保存類對象,有用過jsoup都認識這個用法,不清楚去百度一下
                        for(int i=1;i<es.size();i++){
                                SearchBook book=new SearchBook();
                                Elements tdes= es.get(i).getElementsByTag("td");
                                for(int j=0;j<tdes.size();j++){
                                        switch (j) {
                                        case 0:
                                                book.setSystemnumber(tdes.get(j).getElementsByTag("input").attr("value"));
                                                break;
                                        case 1:
                                                book.setName(tdes.get(j).text().trim());
                                                break;
                                        case 2:
                                                book.setWriter(tdes.get(j).text().trim());
                                                break;
                                        case 3:
                                                book.setPublish(tdes.get(j).text().trim());
                                                break;
                                        case 4:
                                                book.setDate(tdes.get(j).text().trim());
                                                break;
                                        case 5:
                                                book.setSearchnumber(tdes.get(j).text().trim());
                                                break;
                                        case 6:
                                                book.setMax(tdes.get(j).text().trim());
                                                break;
                                        case 7:
                                                book.setMin(tdes.get(j).text().trim());
                                                break;
                                        default:
                                                break;
                                        }
                                }
                                list.add(book);
                                System.out.println(book);
                        }
                        return list;
                }

第二步就進行數據的顯示與布局
這里由於自己做一個布局的話一費時,二來我與不太會做界面,所以直接拿開源工程飯否的界面,改了一下就用上。請高手見諒。。。
這步重點是ListView的用法與異步的使用
代碼比較多,我就不貼了,自己找代碼看下

軟件運行界面:

 

 

 

這些功能都可以對映到網頁上的功能

總結:
個人覺得是搜索功能是完成的比較完全的,在詳細圖書查看本來是想做一個圖書圖片查看的和內容,可惜圖書的圖片不是圖書管理系統里,抓圖有點不方便,內容和目錄又合在一起,顯示非常亂,這個網頁做得太差了,所以沒去抓下來,只抓了有用的藏書地點,修改密碼的功能與說一下,存在的問題就是修改成功與失敗都返回同一個狀態號,所以軟件判斷不了修改結果。只能自己重登陸試下。


最后,說下搜索功能是不需要登陸的

源碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM