Okhttp簡介
okhttp是目前android開發(fā)中比較流行的一個開源網(wǎng)絡(luò)請求框架,相比于官網(wǎng)api提供的網(wǎng)絡(luò)接口有很多優(yōu)點。
android6.0以前,官方sdk提供的是httpUrlConnection,android6.0以后,已經(jīng)將這個框架移除了,目前最常見是okhttp
優(yōu)點
- 1.支持 SPDY ,共享同一個Socket來處理同一個服務(wù)器的所有請求
- 2.緩存響應(yīng)數(shù)據(jù)來減少重復(fù)的網(wǎng)絡(luò)請求
- 3.即便是網(wǎng)絡(luò)出現(xiàn)問題時,okhttp依然起作用.它將從常見的鏈接問題當(dāng)中回復(fù).
- 4.如果你的服務(wù)器有多個IP地址,當(dāng)?shù)匾粋€失敗時,okhttp會自動嘗試連接其他的地址
okhttp使用方法
使用方法很簡單,只需要在gradle中添加一下依賴,就可自動把需要的jar包引入進來
compile 'com.squareup.okhttp3:okhttp:3.4.1'
同時是要需要注意的是,網(wǎng)絡(luò)請求需要請求權(quán)限
在AndroidMainfest.xml中添加網(wǎng)絡(luò)權(quán)限,如下
<uses-permission android:name="android.permission.INTERNET"/>
okhttp獲取json數(shù)據(jù)
移動應(yīng)用的開發(fā),難免要用到j(luò)son數(shù)據(jù)的獲取,一般都是請求數(shù)據(jù),然后將數(shù)據(jù)返回,再進行解析。
由于網(wǎng)絡(luò)請求可能在多個地方用到,我們可以將起封裝成httpUtil類。
1.新建名為HttpUtil的java 類
異步請求方法
public class HttpUtil {
public static void sendRequestWithOkhttp(String address,okhttp3.Callback callback)
{
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
可以看到,我們在類中定義了sendRequeWithOkhttp函數(shù),這就是對于請求函數(shù)的封裝,每次調(diào)用只需把url地址和Callback參數(shù)傳入即可。
第一步,創(chuàng)建OkhttpClient對象
第二步,通過builde()創(chuàng)建Request對象,并且傳入url
第三步,這里創(chuàng)建的是匿名Call對象,將請求放入,enqueue()是異步請求方式。
需要說明的,get請求分為同步和異步,上面的例子是異步的,即傳入的Callback參數(shù)類似于一個接口,okhttp會自動開啟子線程,當(dāng)請求成功時再回調(diào),通過這種回調(diào)機制,我們可以避免服務(wù)器響應(yīng)慢而導(dǎo)致的請求數(shù)據(jù)失敗。(如何回調(diào)在后面會展示)
同步請求方法
public class HttpUtil {
public static String sendRequestWithOkhttp(String address)
{
OkHttpClient client=new OkHttpClient();
Request request = new Request.Builder().url(url) .build();
Response response= client.newCall(request).execute();
String message=response.body().string();
return message;
}
}
可以看到,同步請求后,直接返回string數(shù)據(jù)即可。
為了避免上述提到的問題,我們將以異步請求為例。
2.activity中進行網(wǎng)絡(luò)請求操作
HttpUtil.sendRequestWithOkhttp("http://guolin.tech/api/china", new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
parseJsonWithJsonObject(response);
}
});
}
我們可以直接調(diào)用剛才編寫的網(wǎng)絡(luò)請求工具類,傳入url地址即可,這里用到的是郭霖大神的教學(xué)地址,它可以返回json數(shù)據(jù)。
可以看到,我們傳入okhttp3.Callback參數(shù)即可實現(xiàn)回調(diào),當(dāng)請求成功時,自動調(diào)用onResponse函數(shù),當(dāng)請求失敗,調(diào)用onFailure函數(shù)。在onResponse中即可以對請求所返回的response進行處理,將其轉(zhuǎn)化為String類型。
3.解析json數(shù)據(jù)
[{"id":1,"name":"北京"}
- 類似于這樣的就是json類型的數(shù)據(jù),由兩部分組成,鍵與值構(gòu)成鍵值對。
如id name 即為鍵 1 北京即為值 - 可以根據(jù)鍵來取出對應(yīng)的值,這其實是一種很巧妙的數(shù)據(jù)存儲方式
- 在2中可以看到有一個 parseJsonWithJsonObject(response)函數(shù),這其實是對json解析的封裝。
private void parseJsonWithJsonObject(Response response) throws IOException {
responseData=response.body().string();
try{
JSONArray jsonArray=new JSONArray(responseData);
for(int i=0;i<jsonArray.length();i++)
{
JSONObject jsonObject=jsonArray.getJSONObject(i);
String id=jsonObject.getString("id");
String name=jsonObject.getString("name");
idList.add(id);
nameList.add(name);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
這里采用的是JSONobject方式解析json數(shù)據(jù)。當(dāng)然,還有另一種解析方式,這里不具體講。
首先我們將傳入的response轉(zhuǎn)為string對象,然后創(chuàng)建一個jsonArray對象,在轉(zhuǎn)化為jsonobject對象。最后根據(jù)json的鍵取出對應(yīng)的值
總結(jié)
本文主要對請求和解析這兩個重要的點進行講解,對于解析出的數(shù)據(jù)如何處理細節(jié)不再詳細講,測試的時候可以把數(shù)據(jù)放在listview展示出來,看編寫有沒有成功。