Http請(qǐng)求
- 請(qǐng)求方式
主要包含:GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT,我們一般只用到GET和POST。 -
GET和POST請(qǐng)求的區(qū)別
這兩種方式的區(qū)別主要表現(xiàn)在數(shù)據(jù)傳遞上:
順便我們從請(qǐng)求英文名的字面意思理解一下GET、POST、PUT和DELETE的區(qū)別:Get是最常用的,就是向Web Server發(fā)請(qǐng)求“獲取”資源;那么Post就是向Web Server“郵寄”一些封裝的數(shù)據(jù)包獲取資源,這兩者方法嚴(yán)格的說(shuō)都是“索取”行為。
Delete方法,顧名思義就是通過(guò)http請(qǐng)求刪除指定的URL上的資源啦,Delete請(qǐng)求一般會(huì)返回3種狀態(tài)碼:
200 (OK) - 刪除成功,同時(shí)返回已經(jīng)刪除的資源
202 (Accepted) - 刪除請(qǐng)求已經(jīng)接受,但沒(méi)有被立即執(zhí)行(資源也許已經(jīng)被轉(zhuǎn)移到了待刪除區(qū)域)
204 (No Content) - 刪除請(qǐng)求已經(jīng)被執(zhí)行,但是沒(méi)有返回資源(也許是請(qǐng)求刪除不存在的資源造成的)
而Put方法簡(jiǎn)單理解,就是往Web Server上直接扔資源(上傳資源)嘛![^reference1]
GET,POST,PUT,DELETE URL 全稱是資源描述符,我們可以這樣認(rèn)為:一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查 ,改 ,增 ,刪 4個(gè)操作。到這里,大家應(yīng)該有個(gè)大概的了解了,GET一般用于獲取/查詢 資源信息,而POST一般用于更新 資源信息(個(gè)人認(rèn)為這是GET和POST的本質(zhì)區(qū)別,也是協(xié)議設(shè)計(jì)者的本意,其它區(qū)別都是具體表現(xiàn)形式的差異 )。 [^reference2]
- Android客戶端實(shí)現(xiàn)Http請(qǐng)求的方式和工具們
//1.通過(guò)JDK自帶的URLConnection
//Sun公司提供的庫(kù),也是Java的標(biāo)準(zhǔn)類庫(kù)[java.net]中的一員,但這個(gè)類什么都沒(méi)封裝,用起來(lái)很原始,若需要高級(jí)功能,則會(huì)顯得不太方便,比如重訪問(wèn)的自定義,會(huì)話和cookie等一些高級(jí)功能。
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
} finally {
urlConnection.disconnect();
}
//2.Apache的HttpClient
//Apache公司提供的庫(kù),提供高效的、最新的、功能豐富的支持HTTP協(xié)議工具包,支持HTTP協(xié)議最新的版本和建議,是個(gè)很不錯(cuò)的開(kāi)源框架,封裝了http的請(qǐng)求,參數(shù),內(nèi)容體,響應(yīng)等,擁有眾多API。
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet();
httpClient.execute(httpGet);
最初的時(shí)候,不管是什么Http的框架都是基于以上兩種最基礎(chǔ)的API進(jìn)行了各種再封裝。而且因?yàn)镠ttpURLConnection早期的bug,所以在2.3之后建議使用HttpURLConnection,之前建議使用HttpClient。后來(lái)因?yàn)镠ttpClient的一些缺點(diǎn)和維護(hù)成本較高,Android開(kāi)發(fā)團(tuán)隊(duì)轉(zhuǎn)投更為輕便的HttpUrlConnection,所以5.0之后干脆廢棄了HttpClient,6.0進(jìn)行了刪除。所以在Android-23中的sdk中,已經(jīng)找不到HttpClient了。
當(dāng)然,現(xiàn)在已經(jīng)有了更新的OkHttp:OKHttp是Android版Http客戶端。非常高效,支持SPDY、連接池、GZIP和 HTTP 緩存。從Android4.4開(kāi)始,HttpURLConnection的底層實(shí)現(xiàn)采用的是OkHttp。Volley在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。這里指的是volley使用的http傳輸層,從volley創(chuàng)建RequestQueue的源碼中可以看出:
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
代碼中的HurlStack執(zhí)行網(wǎng)絡(luò)請(qǐng)求就是基于HttpURLConnection的。
不過(guò)因?yàn)閂olley在功能擴(kuò)展性上的局限,始終無(wú)法與OkHttp相比。所以Volley最終停止了更新,而OkHttp得到了官方的認(rèn)可,并在不斷優(yōu)化。不過(guò)Volley可以輕松設(shè)置OkHttp作為其傳輸層,我們的項(xiàng)目中一直用的volley,想要使用OkHttp,只需要下面兩行代碼,指定使用的HttpStack為OkHttpStack即可:
OkHttpClient client = new OkHttpClient();
RequestQueue mRequestQueue = Volley.newRequestQueue(context, new OkHttpStack(client));
