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請求包結構
- 例子:
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響應包結構 - 例子:
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請求方式
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請求字段含義
6.2 response響應字段含義
6.3 緩存機製邏輯圖
其他說明
- 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
- 領英:https://www.linkedin.com/in/chong-yang-049216146/
- 簡書:https://www.jianshu.com/u/b7b2c6ed9284
- csdn:https://my.csdn.net/m0_37700275
- 網易博客:https://yangchong211.blog.163.com/
- 新浪博客:https://blog.sina.com.cn/786041010yc
- github:https://github.com/yangchong211
- 喜馬拉雅聽書:https://www.ximalaya.com/zhubo/71989305/
- 脈脈:yc930211
- 360圖書館:https://www.360doc.com/myfiles.aspx
- 開源中國:https://my.oschina.net/zbj1618/blog
- 泡在網上的日子:https://www.jcodecraeer.com/member/content_list.php?channelid=1
- 郵箱:yangchong211@163.com
- 阿裏雲博客:https://yq.aliyun.com/users/article?spm=5176.100239.headeruserinfo.3.dT4bcV
最後更新:2017-11-09 20:33:43