OkGo 網絡請求框架介紹與使用說明

前言

本文摘自 OkGo,一個專注于讓網絡請求更簡單的框架,與 RxJava 完美結合,比 Retrofit 更簡單易用。

項目地址:https://github.com/jeasonlzy

使用

Android Studio 用戶

一般來說,只需要添加第一個 okgo 的核心包即可,其余的三個庫根據自己的需要選擇添加。

//必須使用
compile 'com.lzy.net:okgo:3.0.4'

//以下三個選擇添加,okrx和okrx2不能同時使用
compile 'com.lzy.net:okrx:1.0.2'
compile 'com.lzy.net:okrx2:2.0.2'  
compile 'com.lzy.net:okserver:2.0.5'

//或者
compile 'com.lzy.net:okgo:+'        //版本號使用 + 可以自動引用最新版
compile 'com.lzy.net:okrx:+'        //版本號使用 + 可以自動引用最新版
compile 'com.lzy.net:okserver:+'    //版本號使用 + 可以自動引用最新版

注意事項

OkGo主要功能

  • 基本的 get、post、put、delete、head、options、trace、patch 八種請求;

  • 支持 upString,upJson,upBytes,upFile 等 up 類方法上傳特定數據;

  • 支持一個 key 上傳一個文件,也可以一個 key 上傳多個文件,也可以多文件和多參數一起上傳;

  • 大文件下載和下載進度回調;

  • 大文件上傳和上傳進度回調;

  • 支持 cookie 的自動管理,并可自定義 cookie 管理策略;

  • 支持緩存模式,不僅支持 http 緩存協議,也支持自定義緩存策略;

  • 支持重定向;

  • 支持自定義超時自動重連次數;

  • 支持鏈式調用;

  • 支持 https 訪問,支持雙向認證;

  • 支持根據 tag 取消請求,也可全部取消;

  • 支持自定義 Callback,自動解析網絡數據;

請求

1. 請求所有配置

無論做什么請求,第一行的泛型一定要加!

注意以下幾點:

  • 這里演示的是一次普通請求所有能配置的參數,真實使用時不需要配置這么多,按自己的需要,選擇性的使用即可;
  • 第一行的泛型一定要特別注意,這個表示你請求網絡的數據類型是什么,必須指定,否則無法解析網絡數據;
  • .post(url):
    這個表示當前請求是 post 請求,當然一共支持
    GET,HEAD,OPTIONS,POST,PUT,DELETE,PATCH, TRACE 這 8 種請求方式,你只需要改改這個方法名就行了,很方便;
  • .params():
    添加參數的時候,最后一個 isReplace 為可選參數,默認為 true,即代表相同 key 的時候,后添加的會覆蓋先前添加的;
  • .tag(this):
    請求的 tag,用于標識當前的請求,方便后續取消對應的請求,如果你不需要取消請求,也可以不用設置;
  • .isMultipart():
    該方法表示是否強制使用 multipart/form-data 表單上傳,因為該框架在有文件的時候,無論你是否設置這個參數,默認都是
    multipart/form-data 格式上傳,但是如果參數中不包含文件,默認使用 application/x-www-form-urlencoded 格式上傳,如果你的服務器要求無論是否有文件,都要使用表單上傳,那么可以用這個參數設置為 true;
  • .isSpliceUrl():
    該方法表示是否強制將 params 的參數拼接到 url 后面,默認 false 不拼接。一般來說,post、put 等有請求體的方法應該把參數都放在請求體中,不應該放在 url 上,但是有的服務端可能不太規范,url 和請求體都需要傳遞參數,那么這時候就使用該參數,它會將你所有使用 .params() 方法傳遞的參數,自動拼接在 url 后面;
  • .retryCount():
    該方法是配置超時重連次數,也可以在全局初始化的時候設置,默認使用全局的配置,即為 3 次,你也可以在這里為你的這個請求特殊配置一個,并不會影響全局其他請求的超時重連次數;
  • .params():
    該方法傳遞鍵值對參數,格式也是 http 協議中的格式,詳細參考上面的 http 協議連接;
  • .addUrlParams() .addFileParams() .addFileWrapperParams():
    這里是支持一個 key 傳遞多個文本參數,也支持一個 key 傳遞多個文件參數,詳細也看上面的 http 協議連接;

另外,每個請求都有一個 .client() 方法可以傳遞一個 OkHttpClient
對象,表示當前這個請求將使用外界傳入的這個 OkHttpClient 對象,其他的請求還是使用全局的保持不變。那么至于這個
OkHttpClient 你想怎么配置,或者配置什么東西,那就隨意了,改個超時時間,加個攔截器什么的統統都是可以的,看你心情嘍。

特別注意: 如果你的當前請求使用的是你傳遞的 OkHttpClient
對象的話,那么當你調用 OkGo.getInstance().cancelTag(tag) 的時候,是取消不了這個請求的,因為 OkGo 只能取消使用全局配置的請求,不知道你這個請求是用你自己的 OkHttpClient 的,如果一定要取消,可以是使用 OkGo 提供的重載方法,詳細看下方的取消請求的部分


2. Response對象介紹

先看Response對象內部的字段:

該對象一共有5個字段,分別表示以下意思:

  • body:當前返回的數據,T 即為數據的泛型。使用方法 body() 獲取該值。如果請求成功,回調 onSuccess(),該字段為 convertResponse() 解析數據后返回的數據。如果發生異常,回調 onError(),該字段值為 null

  • throwable:如果發生異常,回調 onError(),該字段保存了當前的異常信息。如果請求成功,回調 onSuccess(),該字段為 null。使用方法 getException() 獲取該值;

  • isFromCache:表示當前的數據是來自哪里,true:來自緩存,false:來自網絡。使用方法 isFromCache() 獲取該值;

  • rawCall:表示當前請求的真正 okhttp3.Call 對象。使用方法 getRawCall() 獲取該值;

  • rawResponse:表示當前請求服務端真正返回的 okhttp3.Response 對象,注意:如果數據來自緩存,該對象為 null,如果來自網絡,該對象才有值。使用方法 getRawResponse() 獲取該值。

另外,Response 對象還有以下幾個方法:

  • code():http 協議的響應狀態碼,如果數據來自網絡,無論成功失敗,該值都為真實的響應碼,如果數據來自緩存,該值一直為 -1;

  • message():http 協議對響應狀態碼的描述信息,如果數據來自網絡,無論成功失敗,該值都為真實的描述信息,如果數據來自緩存,該值一直為 null

  • headers():服務端返回的響應頭信息,如果數據來自網絡,無論成功失敗,該值都為真實的頭信息,如果數據來自緩存,該值一直為 null

  • isSuccessful():本次請求是否成功,判斷依據是:是否發生了異常。


3. 基本請求

無論做什么請求,第一行的泛型一定要加!

那么我們不可能每次請求都寫上面那么一大堆,這里可以看到,一次簡單的請求,這么寫就夠了。

4. 請求 Bitmap

如果你知道你的請求數據是圖片,可以使用這樣的方法 :

5. 基本文件下載

如果你要下載文件,可以這么寫。

FileCallback 具有三個重載的構造方法,分別是

  • FileCallback():空參構造

  • FileCallback(String destFileName):可以額外指定文件下載完成后的文件名

  • FileCallback(String destFileDir, String destFileName):可以額外指定文件的下載目錄和下載完成后的文件名

文件目錄如果不指定,默認下載的目錄為 sdcard/download/,文件名如果不指定,則按照以下規則命名:

  1. 首先檢查用戶是否傳入了文件名,如果傳入,將以用戶傳入的文件名命名
  2. 如果沒有傳入,那么將會檢查服務端返回的響應頭是否含有
    Content-Disposition=attachment;filename=FileName.txt 該種形式的響應頭,如果有,則按照該響應頭中指定的文件名命名文件,如 FileName.txt
  3. 如果上述響應頭不存在,則檢查下載的文件url,例如:
    http://image.baidu.com/abc.jpg,那么將會自動以 abc.jpg 命名文件
  4. 如果 url 也不能把文件名解析出來,那么最終將以 "unknownfile_" + System.currentTimeMillis() 命名文件

這里面有個新對象叫 Progress,關于這個對象的解釋,看這里我進行了專門的講解


6. 上傳 String 類型的文本

一般此種用法用于與服務器約定的數據格式,當使用該方法時,params 中的參數設置是無效的,所有參數均需要通過需要上傳的文本中指定,此外,額外指定的 header 參數仍然保持有效。

默認會攜帶以下請求頭:

Content-Type: text/plain;charset=utf-8

如果你對請求頭有自己的要求,可以使用這個重載的形式,傳入自定義的 content-type:

// 比如上傳 xml 數據,就可以自己指定請求頭:
upString("這是要上傳的長文本數據!",MediaType.parse("application/xml"))


7. 上傳 JSON 類型的文本

該方法與 upString 沒有本質區別,只是數據格式是 json,一般來說,需要自己創建一個實體 bean 或者一個 map,把需要的參數設置進去,然后通過三方的 Gson 或者 fastjson 轉換成 json 對象,最后直接使用該方法提交到服務器。

默認會攜帶以下請求頭,請不要手動修改,okgo 也不支持自己修改

Content-Type: application/json;charset=utf-8


8. 上傳文件

上傳文件支持文件與參數一起同時上傳,也支持一個 key 上傳多個文件,以下方式可以任選。

特別要注意的是:

  • 很多人會說需要在上傳文件到時候,要把 Content-Type
    修改掉,變成 multipart/form-data,就像下面這樣的。其實在使用 OkGo 的時候,只要你添加了文件,這里的的 Content-Type 不需要你手動設置,OkGo 自動添加該請求頭,同時,OkGo 也不允許你修改該請求頭。

Content-Type: multipart/form-data; boundary=f6b76bad-0345-4337-b7d8-b362cb1f9949

  • 如果沒有文件,那么 OkGo 將自動使用以下請求頭,同樣 OkGo 也不允許你修改該請求頭。

Content-Type: application/x-www-form-urlencoded

  • 如果你的服務器希望你在沒有文件的時候依然使用 multipart/form-data 請求,那么可以使用 .isMultipart(true) 這個方法強制修改,一般來說是不需要強制的。

有人說他有很多文件,不知道數量,又要一個文件對應一個 key 該怎么辦,其實很簡單,把調用鏈斷開,用循環添加就行了嘛。

9. 取消請求

之前講到,我們為每個請求都設置了一個參數 tag,取消就是通過這個 tag 來取消的。通常我們在 Activity 中做網絡請求,當 Activity 銷毀時要取消請求,否則會發生內存泄露,那么就可以在 onDestory() 里面寫如下代碼:

注意以下取消的請求不要全部用,自己按需要寫,我只是寫出來,告訴你有這么幾個方法。

10. 同步請求

同步請求有兩種方式,第一種是返回原始的 Response 對象,自行解析網絡數據,就像這樣:

或者可以返回解析完成的對象,如果你使用過 Retrofit,那么你對這個 Call 對象一定不會陌生,這里面有個方法是 converter(),需要傳遞一個 Converter 接口,作用其實就是解析網絡返回的數據,你也可以自定義 Converter,代碼如下:

什么是同步請求?

同步:提交請求 -> 等待服務器處理 -> 處理完畢返回。這個期間客戶端瀏覽器不能干任何事
異步:請求通過事件觸發 -> 服務器處理(這時客戶端仍然可以作其他事情)-> 處理完畢

同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。

異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。


11. https 請求

https 的請求和 http 請求一模一樣,只需要在初始化配置一下,詳細的 https 配置方法點擊這里


12. 參數的順序

添加 headersparams 的方法各有三處,在提交的時候,他們是有順序的,如果對提交順序有需要的話,請注意這里:

  • 第一個地方,全局初始化時添加
  • 第二個地方,CallbackonStart() 方法中添加

  • 第三個地方,執行網絡請求的時候添加

那么,最終執行請求的參數的添加順序為:

Header 順序: HKAAA -> HKBBB -> HKEEE -> HKFFF -> HKCCC -> HKDDD

Params 順序: PKAAA -> PKBBB -> PKEEE -> PKFFF -> PKCCC -> PKDDD

一句話總結就是:全局添加的在最開始,Callback 添加的在最后,請求添加的在中間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容