**youngnet** 这个网络库,是基于 retofit 进行封装的。该框架支持 restful api 的请求。
支持的请求方式有:get、post、put、delete、options、patch、head
支持自定义数据解析对象
支持Token过期自动刷新模板拦截器
支持设置 Retrofit 的 addConverterFactory 和 addCallAdapterFactory
支持设置 Okhttp 的 addInterceptor 和 addNetworkInterceptor
当前框架,对上面的方式归为了三个构建者:
- 1、YoungNetWorking#createCommonClientCreator:这个构建者,不包含请求体的,
支持:get、delete、options、head
同步和异步调用都支持
- 2、YoungNetWorking#createBodyClientCreator:这个构建者,包含请求体,
支持:post、put、patch
同步和异步调用都支持
- 2、YoungNetWorking#createDownUpClientCreator:这个构建者,做上传和下载的,
支持:单文件上传、多文件上传、单文件下载、多文件下载,
支持上传/下载的子进度回调、总进度回调
同步和异步调用都支持
1、在你项目根目录的 build.gradle 中添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
或者在 settings.gradle 中添加:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2、引入依赖
dependencies {
implementation 'com.github.HZHAndroid:youngnet:1.0.1'
}
在你的 application 中的 onCreate 方法中调用下面的代码,进行初始化配置: 可以参考这里
NetInit.setBaseUrl(Constant.Host.HOST) // 设置基础的请求域名,需要一 / 结尾
.setCommonErrorCallback(object : ICommonErrorCallback {
override fun onCall(e: ApiException) {
// 只要请求异常,都会调用当前方法
// 假如需要特殊处理,假如国际化,或者想变换一下提示消息,可以进行下面的判断,然后利用自定义的消息
// 进行提示,假如不需要,可以直接使用 e.msg
// when (e.code) {
// ErrorCode.NETWORK_ERROR -> {
// // 网络请求异常
// }
// ErrorCode.PARSE_ERROR -> {
// // 数据解析异常
// }
// ErrorCode.DOWNLOAD_EMPTY -> {
// // 下载的内容为空
// }
// 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 执行两次问题(722) https://www.jianshu.com/p/705b1c461040
// 从BODY改成HEADERS解决了重复调用问题
// okhttp添加日志拦截器,上传文件RequestBody.writeTo调用两次
// 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)
)
}
})
- 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<Any> {
override fun onFailure(e: ApiException) {
showResult(e.msg)
hideLoading()
}
override fun onSuccess(data: Any?) {
showResult(data?.toString())
hideLoading()
}
})
- 2、YoungNetWorking#createBodyClientCreator,具体的请求参考这里:
val paramMap = mutableMapOf<String, Any>()
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<Any> {
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<Any> {
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())
}
})
可以创建一个类继承 IDataParser 去实现解析框架的替换
NetInit.setBaseUrl(Constant.Host.HOST) // 设置基础的请求域名,需要一 / 结尾
.dataParser(object :IDataParser() {
override fun <T> parseJson(jsonStr: String, dataType: Type): T {
return null;
}
})
创建一个类继承 TokenInterceptor ,然后实现其中的抽象方法即可, 可以参考这里
1、当前项目已经加入了混淆配置,不需要额外添加混淆配置;
2、如果自己增加了 Retrofit 的请求方法,可以通过 ApiCreateUtil#create 或者 ApiCreateUtil#createDownService 去创建对应的 api 请求类;