之前的项目里网络框架一直用的是retrofit+rxjava这一套,突然看到了一个纯用kotlin写的网络框架,查了一下网上好像对这个的教程并不多,所以就自己弄个demo玩一玩了。如果有兴趣的可以直接点击此处去github上看原库
注:最新版本号请前往github上查询
//core
implementation 'com.github.kittinunf.fuel:fuel:2.2.3'
//android support
implementation 'com.github.kittinunf.fuel:fuel-android:2.2.3'
implementation 'com.github.kittinunf.fuel:fuel-gson:2.2.3'
implementation 'com.github.kittinunf.fuel:fuel-rxjava:2.2.3'
implementation 'com.google.code.gson:gson:2.8.6'
第一个依赖跟第二个依赖是安卓开发必须要添加的,后面是json数据序列化用的我用的是gson,他还支持Jackson/moshi什么的,具体的可以去github上看文档,而且他也支持rxjava,livedata还有协程,开发者可以通过自己的需要来导入响应的库,另外他序列化支持的库还是需要导入相应序列化工具的依赖的,比如我使用的gson,在写入他对gson 支持的依赖之后还需要把gson的依赖写上去。
简单的网络请求可以分两种方式,方式一:
"url"
.httpGet(parameters = listOf(
"key" to "value"
))
.responseString { result: Result<String, FuelError> ->
....
}
方式二:
Fuel
.get(path = "url", parameters = listOf( "key" to "value" ))
.responseString { result: Result<String, FuelError> ->
....
}
如果希望回调的时候使用序列化工具进行解析的话可以这么写(以gson为例子):
"url"
.httpGet()
.responseObject(gsonDeserializer()) { result: Result<T, FuelError> ->
}
这个gsonDeserializer()方法是他gson支持依赖里自带的,当然也可以自定义这个序列化,如果有需要的话可以仿照以下代码更换序列化工具:
class TestDeserializer<T : Any> : ResponseDeserializable<T> {
override fun deserialize(content: String): T? {
return Gson().fromJson<T>(content, object : TypeToken<T>() {}.type)
}
}
然后他也可以设置一些全局的属性:
FuelManager.instance.basePath = BASEURL
FuelManager.instance.baseHeaders = mapOf(
"key" to "value"
)
FuelManager.instance.timeoutInMillisecond = 30000
FuelManager.instance.timeoutReadInMillisecond = 30000
FuelManager.instance.addResponseInterceptor { LogResponseInterceptor(it) }
FuelManager.instance.addRequestInterceptor { LogRequestInterceptor(it) }
这个库自带网络日志打印,所以看着就很香
这个库基本的网络请求都支持,还支持文件都下载和上传,而且可以设置回调显示进度,调用如下:
"url"
.httpDownload()
.fileDestination { response, request ->
File("","")
}
.progress { readBytes, totalBytes ->
}
.responseString { result: Result<String, FuelError> ->
}
"url"
.httpUpload()
.add { FileDataPart(File.createTempFile("","")) }
.progress { readBytes, totalBytes -> }
.responseString { result: Result<String, FuelError> -> }
可以说日常使用你能想到都他基本上都提供了,另外就是这个库不支持websocket。