最近在重構(gòu)公司app的架構(gòu)時(shí)發(fā)現(xiàn)事期,舊項(xiàng)目居然還在用android-async-http溃睹,這個(gè)庫最新版本也是幾年前的了丑婿,關(guān)鍵是Google官方就不推薦http client口予。果不其然 娄周,在測試局域網(wǎng)請求時(shí)發(fā)現(xiàn)android-async-http莫名延遲幾秒(互聯(lián)網(wǎng)請求沒問題),volley測試就都OK沪停。話不多說煤辨,開始動(dòng)刀網(wǎng)絡(luò)庫。
volley
許久未更新的volley最近從1.0.0更新到了1.1.0牙甫,雖然使用方便掷酗,但想要實(shí)現(xiàn)restful又得自己封裝一層,且畢竟java way窟哺,不如kotlin來的簡介泻轰。最大的硬傷,不支持上傳文件且轨,得自己擴(kuò)展浮声。
retrofit+okhttp+rxjava
安卓開發(fā)的主流,retrofit的restful接口很棒旋奢,使用rxjava也簡化了調(diào)用泳挥。但是相比于kotlin,實(shí)在不夠簡潔至朗,且過度的封裝導(dǎo)致注解較多屉符,實(shí)際方法比較深,不夠優(yōu)雅锹引。
Kolley
用kotlin anko的簡潔形式對(duì)okhttp進(jìn)行的網(wǎng)絡(luò)庫封裝矗钟。如果是前期驗(yàn)證demo使用起來可謂得心應(yīng)手。但由于封裝比較高嫌变,對(duì)中大型項(xiàng)目抽調(diào)接口單獨(dú)封裝比較麻煩吨艇。筆者對(duì)此項(xiàng)目貢獻(xiàn)過一個(gè)pull request(解決一個(gè)中文亂碼問題)。附上項(xiàng)目地址:ohmerhe/Kolley腾啥。
Fuel
玩iOS的時(shí)候就深嘆东涡,要是Android也有個(gè)類似moya的網(wǎng)絡(luò)請求封裝就好了。google了半天倘待,終于被我找到了那雙滑板鞋疮跑,不對(duì),是優(yōu)雅的網(wǎng)絡(luò)庫凸舵,號(hào)稱最簡單的kotlin網(wǎng)絡(luò)庫祸挪,且支持android。Fuel默認(rèn)使用URLConnection贞间,可以自己封裝okhttp等作為底層使用贿条。然而這個(gè)庫的國內(nèi)中文資料卻幾乎沒有≡鋈龋看來需要我來安利一波整以。
那么怎么用呢?
首先在build.gradle里集成fuel庫
repositories {
jcenter()
}
dependencies {
compile 'com.github.kittinunf.fuel:fuel-android:1.13.0' //for Android
}
其實(shí)fuel還支持很多擴(kuò)展庫 比如 fuel:fuel-rxjava
峻仇、fuel:fuel-gson
公黑、fuel:fuel-jackson
等等,這里先介紹主要的網(wǎng)絡(luò)請求部分摄咆。
使用fuel發(fā)送get請求:
Fuel.get("http://httpbin.org/post").response { request, response, result ->
val (data, error) = result
}
簡單不凡蚜,一句閉包。有人得問吭从,起碼得有onsuccess朝蜘,onfail回調(diào)啊。別急涩金,都在上面的result
里谱醇。看到val (data, error) = result
了沒步做,result
包含data
返回?cái)?shù)據(jù)和error
錯(cuò)誤兩個(gè)參數(shù)副渴,其中又有如http status code
等參數(shù)。如果error為空全度,則請求成功煮剧,只需要關(guān)注data
的結(jié)果即可。
使用fuel發(fā)送post請求:
Fuel.post("http://httpbin.org/post").body("{ \"foo\" : \"bar\" }").response { request, response, result ->
val (data, error) = result
}
如果有baseURL将鸵,還可以先定義好全局url勉盅,其他接口直接加上url后綴,或者一些例如token等固有header
:
//fuel全局設(shè)置
FuelManager.instance.basePath = "http://httpbin.org"
//直接加后綴進(jìn)行g(shù)et請求
"/get".httpGet().responseString { request, response, result ->
//make a GET to http://httpbin.org/get and do something with response
val (data, error) = result
if (error == null) {
//do something when success
} else {
//error handling
}
}
上傳文件(file形式):
Fuel.upload("/post").source { request, url ->
File.createTempFile("temp", ".tmp");
}.name{"pic"}.responseString { request, response, result ->
}
上傳文件(byteArray形式):
Fuel.upload("/post").blob { request, url ->
Blob("filename.png", bytearray.length, { bytearray.getInputStream() })
}.name{"pic"}.responseString { request, response, result ->
}
返回時(shí)也可以直接使用Gson進(jìn)行結(jié)果解析:
//User Model
data class User(val firstName: String = "",
val lastName: String = "") {
//User Deserializer
class Deserializer : ResponseDeserializable<User> {
override fun deserialize(content: String) = Gson().fromJson(content, User::class.java)
}
}
//Use httpGet extension
"http://www.example.com/user/1".httpGet().responseObject(User.Deserializer()) { req, res, result ->
//result is of type Result<User, Exception>
val (user, err) = result
println(user.firstName)
println(user.lastName)
}
最后附上Fuel的github源碼地址kittinunf/Fuel咨堤,是時(shí)候扔掉retrofit了~