閱讀562 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android 經典筆記之八:網絡請求數據基礎介紹

關於網絡請求數據總結

目錄介紹

  • 1.Http請求與響應
  • 1.1 Http請求包的結構
  • 1.2 HTTP響應包結構
  • 2.Http請求方式
  • 3.Get和Post的比較
  • 3.1 get請求
  • 3.2 post請求
  • 3.3 其他區別
  • 3.4 網絡心聲
  • 4.Http響應方式
  • 5.同步和異步
  • 6.Http緩存機製講解
  • 6.1 request請求字段含義
  • 6.2 response響應字段含義
  • 6.3 緩存機製邏輯圖

0.本人寫的綜合案例

  • 案例
  • 說明及截圖
  • 模塊:新聞,音樂,視頻,圖片,唐詩宋詞,快遞,天氣,記事本,閱讀器等等
  • 接口:七牛,阿裏雲,天行,幹貨集中營,極速數據,追書神器等等

1.Http請求與響應
一次請求就是向目標服務器發送一串文本。什麼樣的文本?有下麵結構的文本。
1.1 HTTP請求包結構
Image.png

  • 例子: POST /meme.php/home/user/login HTTP/1.1 Host: 114.215.86.90 Cache-Control: no-cache Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed Content-Type: application/x-www-form-urlencoded tel=13637829200&password=123456 請求了就會收到響應包(如果對麵存在HTTP服務器) 1.2 HTTP響應包結構 Image.png
  • 例子: HTTP/1.1 200 OK Date: Sat, 02 Jan 2016 13:20:55 GMT Server: Apache/2.4.6 (CentOS) PHP/5.6.14 X-Powered-By: PHP/5.6.14 Content-Length: 78 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: application/json; charset=utf-8 {"status":202,"info":"u6b64u7528u6237u4e0du5b58u5728uff01","data":null} 2.Http請求方式
  • Image.png

3.Get和Post的比較區別
3.1 get請求

  • 在url中填寫參數 https://xxxx.xx.com/xx.php?params1=value1¶ms2=value2 https://api.douban.com/v2/book/search?tag=文學&start=0&count=30
  • 甚至使用路由 https://xxxx.xx.com/xxx/value1/value2/value3 3.2 post請求
  • 參數是經過編碼放在請求體中的。 編碼包括: x-www-form-urlencoded form-data
  • x-www-form-urlencoded的編碼方式是這樣: tel=13637829200&password=123456 `
  • form-data的編碼方式是這樣: ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="tel" 13637829200 ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="password" 123456 ----WebKitFormBoundary7MA4YWxkTrZu0gW ` 3.3 其他區別
  • 因為url是存在於請求行中的。 所以Get與Post區別本質就是參數是放在**請求行**中還是放在**請求體**中。

3.4 網絡心聲

  • Get是明文,Post隱藏 >移動端不是瀏覽器,不用https全都是明文。 Get傳遞數據上限XXX 胡說。有限製的是瀏覽器中的url長度,不是Http協議,移動端請求無影響。Http服務器部分有限製的設置一下即可。

4.Http響應方式

  • 請求是鍵值對,但返回數據我們常用Json。
  • 對於內存中的結構數據,肯定要用數據描述語言將對象序列化成文本,再用Http傳遞,接收端並從文本還原成結構數據。
  • 對象(服務器)<-->文本(Http傳輸)<-->對象(移動端) 。

5.同步和異步的比較
這2個概念僅存在於多線程編程中。
Android中默認隻有一個主線程,也叫UI線程
因為View繪製隻能在這個線程內進行。所以如果你阻塞了(某些操作使這個線程在此處運行了N秒)這個線程,這期間View繪製將不能進行,UI就會卡。所以要極力避免在UI線程進行耗時操作。網絡請求是一個典型耗時操作。
5.1同步寫的方式:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NetUtils.get("https://www.baidu.com");//這行代碼將執行幾百毫秒
    }

這就是同步方式。直接耗時操作阻塞線程直到數據接收完畢然後返回。Android不允許的。會卡死

5.2異步寫的方式:

    //在主線程new的Handler,就會在主線程進行後續處理。
    private Handler handler = new Handler();
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                //從網絡獲取數據
                final String response = NetUtils.get("https://www.baidu.com");
                //向Handler發送處理操作
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //在UI線程更新UI
                        textView.setText(response);
                    }
                });
            }
        }).start();
    }

在子線程進行耗時操作,完成後通過Handler將更新UI的操作發送到主線程執行。這就叫異步。

抽取寫法
記住: 每次都new Thread,new Handler消耗過大

     public class AsynNetUtils {
        public interface Callback{
            void onResponse(String response);
        }

        public static void get(final String url, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.get(url);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }

        public static void post(final String url, final String content, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.post(url,content);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }
    }

    這個直接調用工具類
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.webview);
        AsynNetUtils.get("https://www.baidu.com", new AsynNetUtils.Callback() {
            @Override
            public void onResponse(String response) {
                textView.setText(response);
            }
        });

6.Http緩存機製講解

  • 緩存對於移動端是非常重要的存在。

  • 減少請求次數,減小服務器壓力.

    • 本地數據讀取速度更快,讓頁麵不會空白幾百毫秒。
    • 在無網絡的情況下提供數據。
  • 緩存一般由服務器控製(通過某些方式可以本地控製緩存,比如向過濾器添加緩存控製信息)。通過在請求頭添加下麵幾個字端:

6.1 request請求字段含義

  • Image.png

6.2 response響應字段含義

  • Image.png

6.3 緩存機製邏輯圖

  • Image.png

其他說明

最後更新:2017-11-09 20:33:43

  上一篇:go  如何在阿裏雲申請域名?
  下一篇:go  kafka