方便易用的Android網(wǎng)絡(luò)框架 YoungNet

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)求類;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容