安卓基礎-get post請求與提交資料

世界美景發表於2017-11-03

為什麼寫這篇文章呢?  很簡單的東西 但我發現隨著時間變化 

越基礎的東西忘得越多 準備寫部落格回憶一下 而且目前在做逆向的東西 會寫一些小型APP 但網路請求這塊根本沒必要用框架 所以算是寫個工具部落格專門給自己看的 到時候直接粘程式碼 當然如果能幫到一些朋友 那更好


GET方式提交資料

new Thread(){
    public void run() {
        try {
            //GET請求方式的特點:在url後面組拼資料 根據給的資料不同 介面會返回相應的資料
            String path = "http://192.168.1.103:8080/web/Test?imei="+IMEI+"&=model"+MODEL);
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5000);
            int code = conn.getResponseCode();
            if(code == 200){
                InputStream is = conn.getInputStream();
                String result = StreamTools.readStream(is);
                Message msg = Message.obtain();
                msg.what = SUCCESS;
                msg.obj = result;
                handler.sendMessage(msg);
            }else{
                Message msg = Message.obtain();
                msg.what = ERROR;
                handler.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Message msg = Message.obtain();
            msg.what = ERROR;
            handler.sendMessage(msg);
        }
    };
}.start();

POST方式提交資料

new Thread(){
    public void run() {
        //路徑不需要組拼
        String path = "http://192.168.1.103:8080/web/Test";
        try {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //1.設定請求方式為POST
            conn.setRequestMethod("POST"); //注意單詞必須大寫.
            conn.setConnectTimeout(5000);
            //2.設定http請求資料的型別為表單型別
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //3.設定給伺服器寫的資料的長度
            // imei=865161564315&model=huawei G720-t01
            String data = "imei="+IMEI+"&model="+MODEL;
            conn.setRequestProperty("Content-Length", String.valueOf(data.length()));
            //4.記得指定要給伺服器寫資料
            conn.setDoOutput(true);
            //5.開始向伺服器寫資料
            conn.getOutputStream().write(data.getBytes());
            int code = conn.getResponseCode();
            if(code == 200){
                InputStream is = conn.getInputStream();
                String result = StreamTools.readStream(is);
                Message msg = Message.obtain();
                msg.what = SUCCESS;
                msg.obj = result;
                handler.sendMessage(msg);
            }else{
                Message msg = Message.obtain();
                msg.what = ERROR;
                handler.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Message msg = Message.obtain();
            msg.what = ERROR;
            handler.sendMessage(msg);
        }
    };
}.start();
  protected static final int SUCCESS = 1;
    protected static final int ERROR = 2;
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {

            switch (msg.what) {
                case ERROR:
                    Toast.makeText(MainActivity.this, "網路異常", Toast.LENGTH_SHORT)
                            .show();
                    break;

                case SUCCESS:
                    String http = (String) msg.obj;
                    break;
            }
        }
    };







GET請求和POST請求的區別

優缺點
* GET請求
優點:使用非常方便,只需要在url後面組拼資料。
缺點:資料在url的後面組拼,不安全。有資料長度限制。
* POST請求
優點:安全,資料不是在url後面組拼而是透過流的方式寫給伺服器。資料長度不受限制
缺點:編寫麻煩。

資料提交
* GET請求
1. 需要在url後面組拼提交的資料
* POST請求
1. 不需要組拼任何的資料
2. 必須指定請求的資料型別,是一個經過url編碼的表單資料。Content-Type
3. 以流的方式把資料寫給伺服器,所以必須指定提交資料的長度。Content-Length

總結

就安全來說 其實這兩種根本就沒區別 如果是https的話會好一些 但如果用charles 或者Fiddler 抓包大部分資料都可以看到

https的話頂多不好做一些劫持 但如果找到應用內部請求程式碼 可以用replace把 https 在內部轉成http 在重打包就可以了 

至於說實際過程中用到那種 根據當前情況來 有時候後臺會限制你用get還是post 大部分還是想用那種用那種

GB2312和GBK

GB2312
1980年釋出,標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時,GB2312收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裡爾字母在內的682個全形字元。
GB 2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。
對於人名、古漢語等方面出現的罕用字,GB2312不能處理,這導致了後來GBK及GB18030漢字字符集的出現。
GBK
1995年釋出,是在GB2312-80標準基礎上的內碼擴充套件規範,共收錄了21003個漢字,完全相容GB2312-80標準。

string.getBytes(String charsetName)和new String(byte[] bytes, String charsetName)

  1. byte[] bytes = string.getBytes(String charsetName)
    將字串按指定的編碼轉化為byte陣列,預設採用本地碼錶
  2. new String(byte[] bytes, String charsetName)
    將byte陣列按指定的編碼轉化為字串

注意:出現亂碼時不要修改檔案,修改後無論怎麼切換編碼都是錯的了

提交資料中含有中文的注意事項

客戶端

//提交的資料中含有中文時,將字串IMEI按照編碼UTF-8進行編碼
URLEncoder.encode(IMEI, "UTF-8");

HttpClient的GET請求

GET請求

new Thread(){
    public void run() {
        try {
            String path = "介面地址";
            //1.開啟瀏覽器
            HttpClient client = new DefaultHttpClient();
            //2.輸入地址或者資料
            HttpGet httpGet = new HttpGet(path);
            //3.敲回車
            HttpResponse response = client.execute(httpGet);
            //獲取狀態碼
            int code = response.getStatusLine().getStatusCode();
            if(code == 200){
                InputStream is = response.getEntity().getContent();
                String result = StreamTools.readStream(is);
                Message msg = Message.obtain();
                msg.what = SUCCESS;
                msg.obj = result;
                handler.sendMessage(msg);
            }else{
                Message msg = Message.obtain();
                msg.what = ERROR;
                handler.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Message msg = Message.obtain();
            msg.what = ERROR;
            handler.sendMessage(msg);
        }
    };
}.start();

總結

以下會出現的問題 在androidStudio中httpClient會報錯找不到 HttpClient都被google廢棄了 在6.0 SDK中直接拿掉了
需要要在build.gradle 進行引用 就可以正常使用了 

andoird{
useLibrary 'org.apache.http.legacy'
}  




相關文章