Android客戶端的Http請(qǐng)求

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));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容