前言
使用
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:+' //版本號使用 + 可以自動引用最新版
注意事項
- 使用該網絡框架時,必須要在 Application 中做初始化,詳細的初始化辦法點擊這里
-
okgo
使用的okhttp
的版本是最新的3.8.0版本,OkGo詳細文檔點擊這里 -
okrx
是基于RxJava
的擴展項目,OkRx詳細文檔點擊這里 -
okrx2
是基于RxJava2
的擴展項目,OkRx2詳細文檔點擊這里 -
okserver
是對okgo
的擴展,包含兩個核心入口類:-
OkDownload
是統一的下載管理,支持斷點續傳功能,OkDownload詳細文檔點擊這里 -
OkUpload
是統一的上傳管理,OkUpload詳細文檔點擊這里
-
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 次,你也可以在這里為你的這個請求特殊配置一個,并不會影響全局其他請求的超時重連次數;
- .cacheKey() .cacheTime() .cacheMode():
這三個是緩存相關的配置,詳細請看緩存介紹;
- .headers():
該方法是傳遞服務端需要的請求頭,如果你不知道什么是請求頭,看wiki首頁關于網絡抓包中的http協議鏈接;
- .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/
,文件名如果不指定,則按照以下規則命名:
- 首先檢查用戶是否傳入了文件名,如果傳入,將以用戶傳入的文件名命名
- 如果沒有傳入,那么將會檢查服務端返回的響應頭是否含有
Content-Disposition=attachment;filename=FileName.txt
該種形式的響應頭,如果有,則按照該響應頭中指定的文件名命名文件,如FileName.txt
;- 如果上述響應頭不存在,則檢查下載的文件url,例如:
http://image.baidu.com/abc.jpg
,那么將會自動以abc.jpg
命名文件- 如果 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)
這個方法強制修改,一般來說是不需要強制的。
9. 取消請求
之前講到,我們為每個請求都設置了一個參數 tag
,取消就是通過這個 tag
來取消的。通常我們在 Activity
中做網絡請求,當 Activity
銷毀時要取消請求,否則會發生內存泄露,那么就可以在 onDestory()
里面寫如下代碼:
10. 同步請求
同步請求有兩種方式,第一種是返回原始的 Response 對象,自行解析網絡數據,就像這樣:或者可以返回解析完成的對象,如果你使用過 Retrofit
,那么你對這個 Call
對象一定不會陌生,這里面有個方法是 converter()
,需要傳遞一個 Converter
接口,作用其實就是解析網絡返回的數據,你也可以自定義 Converter
,代碼如下:
什么是同步請求?
同步:提交請求 -> 等待服務器處理 -> 處理完畢返回。這個期間客戶端瀏覽器不能干任何事
異步:請求通過事件觸發 -> 服務器處理(這時客戶端仍然可以作其他事情)-> 處理完畢
同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。
異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。
11. https 請求
https 的請求和 http 請求一模一樣,只需要在初始化配置一下,詳細的 https 配置方法點擊這里。
12. 參數的順序
添加 headers
和 params
的方法各有三處,在提交的時候,他們是有順序的,如果對提交順序有需要的話,請注意這里:
-
第一個地方,全局初始化時添加
-
第二個地方,
Callback
的onStart()
方法中添加 -
第三個地方,執行網絡請求的時候添加
那么,最終執行請求的參數的添加順序為:
Header 順序: HKAAA -> HKBBB -> HKEEE -> HKFFF -> HKCCC -> HKDDD
Params 順序: PKAAA -> PKBBB -> PKEEE -> PKFFF -> PKCCC -> PKDDD
一句話總結就是:全局添加的在最開始,Callback 添加的在最后,請求添加的在中間。