新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 一步步教你為網站開發Android客戶端

        一步步教你為網站開發Android客戶端

        作者: 時間:2016-10-08 來源:網絡 收藏

        Submit是查詢或重填,有 查 詢 和 重 填 兩種值

        至此,我們弄清楚了POST Data里所有內容的含義和取值可能。但我們模擬POST請求為什么,其實就是為了得到搜索的書目信息,所以我們看一下返回的Content是不是我們要的東西

        果然,就是我們搜到的書目信息,就以String的形式放在Content里面。最后我們查看一下Stream,截圖,以防等下我們需要這里面的東西

        好了,這個頁面的工作原理我們已經弄清楚了:用戶在網頁中輸入搜索內容后,點擊查詢,瀏覽器會POST一個Data到目標網址,該網址的返回信息就是搜到的書目。

        我們開始編寫代碼,模擬這個過程,先打開eclipse建立一個Java項目(注意是Java項目,因為Java項目可以完美移植到Android項目中且調試方便,并且模擬Http請求這一過程沒有用到任何Android功能)。

        導入HttpClient的4個包commons-codec、commons-httpclient、commons-logging、log4j。

        //實例化HttpClient

        HttpClient client = new HttpClient();

        //Stream頁面里面有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));



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 常德市| 石渠县| 阳山县| 武宣县| 三亚市| 霍邱县| 临安市| 和林格尔县| 潜江市| 响水县| 鄂伦春自治旗| 纳雍县| 吴川市| 大石桥市| 伊宁市| 金堂县| 饶平县| 航空| 长沙市| 曲沃县| 阳信县| 台湾省| 全州县| 内丘县| 哈尔滨市| 祥云县| 交城县| 安远县| 汝州市| 蒙山县| 建水县| 镇原县| 灵寿县| 肇源县| 洮南市| 五大连池市| 普兰店市| 兰西县| 湟中县| 浪卡子县| 荥经县|