YoungNet網(wǎng)絡(luò)庫傳送:youngnet
介紹
**youngnet**這個網(wǎng)絡(luò)庫抡砂,是基于retofit進(jìn)行封裝的。該框架支持restful api的請求铝条。
支持的請求方式有:get糖荒、post杉辙、put、delete捶朵、options蜘矢、patch、head
支持自定義數(shù)據(jù)解析對象
支持Token過期自動刷新模板攔截器
支持設(shè)置Retrofit的addConverterFactory和addCallAdapterFactory
支持設(shè)置Okhttp的addInterceptor和addNetworkInterceptor
當(dāng)前框架综看,對上面的方式歸為了三個構(gòu)建者:
- 1品腹、YoungNetWorking#createCommonClientCreator:這個構(gòu)建者,不包含請求體的红碑,
支持:get舞吭、delete、options、head
同步和異步調(diào)用都支持
- 2镣典、YoungNetWorking#createBodyClientCreator:這個構(gòu)建者兔毙,包含請求體,
支持:post兄春、put澎剥、patch
同步和異步調(diào)用都支持
- 2、YoungNetWorking#createDownUpClientCreator:這個構(gòu)建者赶舆,做上傳和下載的哑姚,
支持:單文件上傳、多文件上傳芜茵、單文件下載叙量、多文件下載,
支持上傳/下載的子進(jìn)度回調(diào)九串、總進(jìn)度回調(diào)
同步和異步調(diào)用都支持
Demo運(yùn)行效果圖
使用
一绞佩、初始化
在你的 application 中的 onCreate 方法中調(diào)用下面的代碼,進(jìn)行初始化配置:
可以參考初始化配置
NetInit.setBaseUrl(Constant.Host.HOST) //設(shè)置基礎(chǔ)的請求域名猪钮,需要一/結(jié)尾
.setCommonErrorCallback(object : ICommonErrorCallback {
override fun onCall(e: ApiException) {
//只要請求異常品山,都會調(diào)用當(dāng)前方法
//假如需要特殊處理,假如國際化烤低,或者想變換一下提示消息肘交,可以進(jìn)行下面的判斷,然后利用自定義的消息
//進(jìn)行提示扑馁,假如不需要涯呻,可以直接使用e.msg
//? ? ? ? ? ? ? ? ? ? when (e.code) {
//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.NETWORK_ERROR -> {
//? ? ? ? ? ? ? ? ? ? ? ? ? ? //網(wǎng)絡(luò)請求異常
//? ? ? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.PARSE_ERROR -> {
//? ? ? ? ? ? ? ? ? ? ? ? ? ? //數(shù)據(jù)解析異常
//? ? ? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.DOWNLOAD_EMPTY -> {
//? ? ? ? ? ? ? ? ? ? ? ? ? ? //下載的內(nèi)容為空
//? ? ? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.UNKNOWN_ERROR -> {
//? ? ? ? ? ? ? ? ? ? ? ? ? ? //其他異常
//? ? ? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? ? ? }
showToast(e.msg ?: "")
}
})
.init(object : IDoNetConfig {
override fun onConfig(config: NetConfig) {
//普通api請求的配置
config
.addInterceptor(TestTokenInterceptor())
.addNetworkInterceptor(
HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Log.e("shenlong", "message = $message")
}
}).setLevel(HttpLoggingInterceptor.Level.BODY)
)
}
}, object : IDoNetConfig {
override fun onConfig(config: NetConfig) {
//上傳下載api請求的配置
// RequestBody writeTo執(zhí)行兩次問題(722)http://www.reibang.com/p/705b1c461040
//從BODY改成HEADERS解決了重復(fù)調(diào)用問題
// okhttp添加日志攔截器,上傳文件RequestBody.writeTo調(diào)用兩次
// https://blog.csdn.net/u013626215/article/details/107014153
config.addNetworkInterceptor(
HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Log.e("shenlong", "message = $message")
}
}).setLevel(HttpLoggingInterceptor.Level.HEADERS)
)
}
})
二腻要、代碼調(diào)用
- 1复罐、YoungNetWorking#createCommonClientCreator,具體的請求參考這里:
YoungNetWorking.createCommonClientCreator("user", Any::class.java)
.addParam("userId", "${SystemClock.currentThreadTimeMillis()}")
.addHeader("agent","android-app")
.setGetCall(object : IGetCall {
override fun onGet(call: Call<*>) {
Log.e("shenlong", "call call call ${call}")
}
})
.build()
.get(object : ICallback {
override fun onFailure(e: ApiException) {
showResult(e.msg)
hideLoading()
}
override fun onSuccess(data: Any?) {
showResult(data?.toString())
hideLoading()
}
})
- 2闯第、YoungNetWorking#createBodyClientCreator市栗,具體的請求參考這里:
val paramMap = mutableMapOf()
paramMap["userId"] = "${SystemClock.currentThreadTimeMillis()}"
paramMap["bookId"] = "${SystemClock.currentThreadTimeMillis()}"
YoungNetWorking.createBodyClientCreator("book", Any::class.java)
.setBody(
JsonUtil.toJson(paramMap)
.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
)
.addHeader("agent", "android-app")
.setGetCall(object : IGetCall {
override fun onGet(call: Call<*>) {
Log.e("shenlong", "call call call ${call}")
}
})
.build()
.post(object : ICallback {
override fun onFailure(e: ApiException) {
showResult("post ${e.msg}")
hideLoading()
}
override fun onSuccess(data: Any?) {
showResult("post ${data?.toString()}")
hideLoading()
}
})
- 3、YoungNetWorking#createDownUpClientCreator咳短,具體的請求參考這里:
下載:
val file = File(cacheDir, "hello.jpg")
YoungNetWorking.createDownUpClientCreator(
"https://ae01.alicdn.com/kf/Uf8cd7a9ee0054a1c85f95633ccb722fc3.jpg",
String::class.java
)
.addParam("hello", "hi")
.addHeader(
"shenlong",
"tian"
)
.build()
.download(file, getDownloadCallback("download"))
上傳:
YoungNetWorking.createDownUpClientCreator(
"https://imgbb.com/json",
Any::class.java
)
.addParam("action", "upload")
.addParam("auth_token", "232c8e0cdb5e960cfc2233b80bd8ad7345b17090")
.addParam("timestamp", "1630168059700")
.addParam("type", "file")
.build()
.upload("source", file, getUploadCallback(stringBuffer),
object : ICallback {
override fun onFailure(e: ApiException) {
stringBuffer.append("onFailure = ${e.msg} ${e.message}")
showResult(stringBuffer.toString())
}
override fun onSuccess(data: Any?) {
stringBuffer.append("onSuccess = ${data}")
showResult(stringBuffer.toString())
}
})
三、自定義數(shù)據(jù)解析對象
可以創(chuàng)建一個類繼承 IDataParser 去實(shí)現(xiàn)解析框架的替換
NetInit.setBaseUrl(Constant.Host.HOST) // 設(shè)置基礎(chǔ)的請求域名蛛淋,需要一 / 結(jié)尾
.dataParser(object :IDataParser() {
override fun parseJson(jsonStr: String, dataType: Type): T {
return null;
}
? ? ? ? ? ? })
四咙好、自定義token過期自動刷新攔截器
創(chuàng)建一個類繼承 TokenInterceptor ,然后實(shí)現(xiàn)其中的抽象方法即可褐荷,
可以參考這里
五勾效、其他
1、當(dāng)前項(xiàng)目已經(jīng)加入了混淆配置,不需要額外添加混淆配置层宫;
2杨伙、如果自己增加了Retrofit的請求方法,可以通過ApiCreateUtil#create或者ApiCreateUtil#createDownService去創(chuàng)建對應(yīng)的api請求類萌腿;