YoungNet網(wǎng)絡(luò)庫傳送:youngnet
介紹
**youngnet**這個(gè)網(wǎng)絡(luò)庫,是基于retofit進(jìn)行封裝的。該框架支持restful api的請(qǐng)求。
支持的請(qǐng)求方式有:get、post、put、delete、options、patch、head
支持自定義數(shù)據(jù)解析對(duì)象
支持Token過期自動(dòng)刷新模板攔截器
支持設(shè)置Retrofit的addConverterFactory和addCallAdapterFactory
支持設(shè)置Okhttp的addInterceptor和addNetworkInterceptor
當(dāng)前框架,對(duì)上面的方式歸為了三個(gè)構(gòu)建者:
- 1、YoungNetWorking#createCommonClientCreator:這個(gè)構(gòu)建者,不包含請(qǐng)求體的,
支持:get、delete、options、head
同步和異步調(diào)用都支持
- 2、YoungNetWorking#createBodyClientCreator:這個(gè)構(gòu)建者,包含請(qǐng)求體,
支持:post、put、patch
同步和異步調(diào)用都支持
- 2、YoungNetWorking#createDownUpClientCreator:這個(gè)構(gòu)建者,做上傳和下載的,
支持:?jiǎn)挝募蟼?、多文件上傳、單文件下載、多文件下載,
支持上傳/下載的子進(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ǔ)的請(qǐng)求域名,需要一/結(jié)尾
.setCommonErrorCallback(object : ICommonErrorCallback {
override fun onCall(e: ApiException) {
//只要請(qǐng)求異常,都會(huì)調(diào)用當(dāng)前方法
//假如需要特殊處理,假如國(guó)際化,或者想變換一下提示消息,可以進(jìn)行下面的判斷,然后利用自定義的消息
//進(jìn)行提示,假如不需要,可以直接使用e.msg
//? ? ? ? ? ? ? ? ? ? when (e.code) {
//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.NETWORK_ERROR -> {
//? ? ? ? ? ? ? ? ? ? ? ? ? ? //網(wǎng)絡(luò)請(qǐng)求異常
//? ? ? ? ? ? ? ? ? ? ? ? }
//? ? ? ? ? ? ? ? ? ? ? ? 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請(qǐng)求的配置
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請(qǐng)求的配置
// RequestBody writeTo執(zhí)行兩次問題(722)http://m.itdecent.cn/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,具體的請(qǐng)求參考這里:
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,具體的請(qǐng)求參考這里:
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,具體的請(qǐng)求參考這里:
下載:
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ù)解析對(duì)象
可以創(chuàng)建一個(gè)類繼承 IDataParser 去實(shí)現(xiàn)解析框架的替換
NetInit.setBaseUrl(Constant.Host.HOST) // 設(shè)置基礎(chǔ)的請(qǐng)求域名,需要一 / 結(jié)尾
.dataParser(object :IDataParser() {
override fun parseJson(jsonStr: String, dataType: Type): T {
return null;
}
? ? ? ? ? ? })
四、自定義token過期自動(dòng)刷新攔截器
創(chuàng)建一個(gè)類繼承 TokenInterceptor ,然后實(shí)現(xiàn)其中的抽象方法即可,
可以參考這里
五、其他
1、當(dāng)前項(xiàng)目已經(jīng)加入了混淆配置,不需要額外添加混淆配置;
2、如果自己增加了Retrofit的請(qǐng)求方法,可以通過ApiCreateUtil#create或者ApiCreateUtil#createDownService去創(chuàng)建對(duì)應(yīng)的api請(qǐng)求類;