【Android】OkHttp3總結(jié)與封裝

開(kāi)始使用

在app目錄下的build.gradle中添加依賴:

implementation 'com.squareup.okhttp3:okhttp:3.13.1'
implementation 'com.squareup.okio:okio:2.2.2'

GET方法

OkHttpClient client = new OkHttpClient.Builder().build();
Request.Builder builder = new Request.Builder().url(url);
builder.method("GET", null);
Request request = builder.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        ...
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        ...
    }
});

GET參數(shù)的傳遞可以使用拼接字符串的方式直接拼接到url中。

POST方法

OkHttpClient client = new OkHttpClient.Builder().build();
FormBody.Builder formBody = new FormBody.Builder();
formBody.add(key,value);
... // 添加參數(shù)
RequestBody form = formBody.build();
Request.Builder builder = new Request.Builder();
Request request = builder.post(form)
        .url(url)
        .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        ...
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        ...
    }
});

封裝

由于OkHttp發(fā)送請(qǐng)求的方式比較繁瑣,需要構(gòu)建許多參數(shù)融求,所以需要我們自己進(jìn)行封裝,以下是我的封裝方式:

/**
- @author:y4ngyy
*/

public class HttpClient {
    private OkHttpClient client;
    private static HttpClient mClient;
    private Context context;
    private HttpClient(Context c) {
        context = c;
        client = new OkHttpClient.Builder()
                .cookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)))
                .followRedirects(true)
                .followSslRedirects(true)
                .build();
    }

    public static HttpClient getInstance(Context c){
        if (mClient == null) {
            mClient = new HttpClient(c);
        }
        return  mClient;
    }


    // GET方法
    public void get(String url, HashMap<String,String> param, MyCallback callback) {
        // 拼接請(qǐng)求參數(shù)
        if (!param.isEmpty()) {
            StringBuffer buffer = new StringBuffer(url);
            buffer.append('?');
            for (Map.Entry<String,String> entry: param.entrySet()) {
                buffer.append(entry.getKey());
                buffer.append('=');
                buffer.append(entry.getValue());
                buffer.append('&');
            }
            buffer.deleteCharAt(buffer.length()-1);
            url = buffer.toString();
        }
        Request.Builder builder = new Request.Builder().url(url);
        builder.method("GET", null);
        Request request = builder.build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.failed(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                callback.success(response);
            }
        });
    }

    public void get(String url, MyCallback callback) {
        get(url, new HashMap<String, String>(), callback);
    }

    // POST 方法
    public void post(String url, HashMap<String, String> param, MyCallback callback) {
        FormBody.Builder formBody = new FormBody.Builder();
        if(!param.isEmpty()) {
            for (Map.Entry<String,String> entry: param.entrySet()) {
                formBody.add(entry.getKey(),entry.getValue());
            }
        }
        RequestBody form = formBody.build();
        Request.Builder builder = new Request.Builder();
        Request request = builder.post(form)
                .url(url)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.failed(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                callback.success(response);
            }
        });
    }
    public interface MyCallback {
        void success(Response res) throws IOException;
        void failed(IOException e);
    }
}

想法有以下幾點(diǎn):

  1. get()post()方法中猖毫,將需要的參數(shù)以HashMap傳遞鍵值對(duì)保礼,并把相應(yīng)操作封裝。
  2. 第二個(gè)get()重載是考慮到不需要參數(shù)的GET請(qǐng)求的情況甩挫。
  3. 留下myCallback接口來(lái)對(duì)不同請(qǐng)求做處理贴硫。
  4. 由于需要保持cookie來(lái)做登錄等操作,所以用到了第三方庫(kù)PersistentCookieJar
  5. 考慮到cookie的問(wèn)題伊者,在不同的activity間需要使用同一個(gè)實(shí)例才行英遭,有想過(guò)使用Intent序列化傳遞對(duì)象,但由于activity太多亦渗,傳遞太繁瑣挖诸,所以直接寫成單例模式。

對(duì)于OkHttp的源碼還沒(méi)有深究法精,有時(shí)間再繼續(xù)研究多律。

具體使用方法

  1. 調(diào)用HttpClient.getInstance()獲取實(shí)例
  2. 使用實(shí)例調(diào)用get和post方法,其中需要傳入url搂蜓,參數(shù)(get可以不傳)以及MyCallBack回調(diào)

只是菜雞一個(gè)..有錯(cuò)還請(qǐng)指正..繼續(xù)努力學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狼荞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帮碰,更是在濱河造成了極大的恐慌相味,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殉挽,死亡現(xiàn)場(chǎng)離奇詭異丰涉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)此再,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門昔搂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人输拇,你說(shuō)我怎么就攤上這事摘符。” “怎么了策吠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵逛裤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猴抹,道長(zhǎng)带族,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任蟀给,我火速辦了婚禮蝙砌,結(jié)果婚禮上阳堕,老公的妹妹穿的比我還像新娘。我一直安慰自己择克,他們只是感情好恬总,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著肚邢,像睡著了一般壹堰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骡湖,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天贱纠,我揣著相機(jī)與錄音,去河邊找鬼响蕴。 笑死谆焊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的换途。 我是一名探鬼主播懊渡,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼军拟!你這毒婦竟也來(lái)了剃执?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懈息,失蹤者是張志新(化名)和其女友劉穎肾档,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辫继,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怒见,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姑宽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣耍。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炮车,靈堂內(nèi)的尸體忽然破棺而出舵变,到底是詐尸還是另有隱情,我是刑警寧澤瘦穆,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布纪隙,位于F島的核電站,受9級(jí)特大地震影響扛或,放射性物質(zhì)發(fā)生泄漏绵咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一熙兔、第九天 我趴在偏房一處隱蔽的房頂上張望悲伶。 院中可真熱鬧艾恼,春花似錦、人聲如沸拢切。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淮椰。三九已至,卻和暖如春纳寂,著一層夾襖步出監(jiān)牢的瞬間主穗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工毙芜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忽媒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓腋粥,卻偏偏與公主長(zhǎng)得像晦雨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隘冲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 昨天參加了一個(gè)以前從未這么多人的聚會(huì)闹瞧,沒(méi)有一個(gè)熟悉的面孔,卻彼此熱情友好展辞。沒(méi)有高低貴賤奥邮,沒(méi)有利益紛爭(zhēng),彼此充滿期待...
    任性的喵喵閱讀 232評(píng)論 1 1
  • 你總是對(duì)別人羨慕嫉妒恨蘸朋,你覺(jué)得自己嫉妒心太重,可是如果你不是那么要強(qiáng)扣唱,又怎會(huì)嫉妒藕坯,又如何督促自己變得更好...
    綿羊糖閱讀 367評(píng)論 2 4
  • 2019-1-17 有關(guān)表達(dá)的方法: 001.第一個(gè)點(diǎn),你必須要懂画舌。你必須要懂你才能寫好堕担。 002.第二點(diǎn)就是對(duì)人...
    微風(fēng)嘻嘻閱讀 88評(píng)論 0 1
  • 尊敬的外來(lái)朋友: 你們好! 歡迎你們來(lái)肇慶過(guò)大年曲聂,“過(guò)年”是春節(jié)的俗稱霹购,是一年中最隆重,最盛大的節(jié)...
    彌足珍貴小珍閱讀 371評(píng)論 0 2
  • “工匠精神”膜楷,這個(gè)詞語(yǔ)被寫入了中國(guó)政府工作報(bào)告,隨著兩會(huì)紅遍大江南北贞奋《奶“游刃有余”的庖丁,技藝精湛的魯班轿塔,中國(guó)幾千...
    蓮蓮喬閱讀 1,365評(píng)論 0 0