Android-okhttp獲取json數(shù)據(jù)及解析

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展示出來,看編寫有沒有成功。

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評論 25 709
  • 參考Android網(wǎng)絡(luò)請求心路歷程Android Http接地氣網(wǎng)絡(luò)請求(HttpURLConnection) 一...
    合肥黑閱讀 21,697評論 7 63
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,279評論 0 15
  • “在過去的年代,商人是個賤業(yè),即便再有錢也沒什么地位”尹海東開口說了風(fēng)馬牛不相及的一句話,我們歲然詫異,卻沒有打斷...
    初霽713閱讀 247評論 0 2

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