一个封装了Okhttp的library
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.50"
implementation 'com.devin:mercury:0.0.6'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.google.code.gson:gson:2.8.0'
Mercury.init(Mercury.Builder()
.context(this@App)
.host("http://www.baidu.com/")
.okHttpClient(OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.addInterceptor(ChuckInterceptor(this@App).showNotification(true))
.build())
.filter(object : MercuryFilter {
override fun body(body: String, clazz: Class<*>): MercuryFilterModel {
// 比如:返回的JSON Body {"success":true,"code":0,"data":"7mAFuvXiU1"} 其中data字段是加密的,我们可以解密,然后在传给下一层
// 还可以根据code做一些业务判断,比如code是-100的时候需要重新登录,如果model.success = false,会走Fail回调,如果model.success = true,会走Success回调,可以做一些拦截
val model = MercuryFilterModel()
val parser = JsonParser()
val jsonObject = parser.parse(body).asJsonObject
val data = jsonObject.get("data").asString
jsonObject.add("data", parser.parse(AES.INSTANCE.decryptAES(CommonBusinessStaticValue.AES_KEY, data)))
model.body = jsonObject.toString()
return model
}
})
.contentType(MercuryContentType.JSON))
Mercury.addMercuryConfig(object : MercuryConfig {
override fun getApplication(): Application? {
return this@App
}
override fun getOkClient(): OkHttpClient? {
return OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.addInterceptor(ChuckInterceptor(this@App).showNotification(true))
.build()
}
override fun getContentType(): String? {
return MercuryContentType.JSON
}
override fun getHost(): String? {
return "https://www.im.com/"
}
override fun getGlobalFilter(): MercuryFilter? {
// 可以做加密解密等操作
return null
}
override fun getConfigName(): String {
return "IM"
}
})
@Get(url = "")
class BaseRequest : MercuryRequest() // 此次请求会被默认的MercuryConfig调用
@Get(url = "")
class IMBaseRequest : MercuryRequest(“IM”) // 此次请求会被叫“IM”的MercuryConfig调用
@Post(url = "")
@ContentType(type = MercuryContentType.FORM)
class BaseRequest : MercuryRequest()
- Request Model实体类注解方法必须是Get或者Post
- 第一次请求后,如果返回,会缓存下来,第二次同样的请求(url 和 请求参数一致)首先会走缓存的数据,然后会回调
@Cache
class MainRequest(var id: String, var name: String) : MercuryRequest()
LastContactsRequest(shopId).requestByLifecycle(LastContactsResponse::class.java,{})
BaseRequest("10086", "Devin")
.request(BaseResponse::class.java
, startCallback = {
progressBar.visibility = View.VISIBLE
println(">>>>>start: $请求开始的回调<<<<<")
}
, endCallback = {
progressBar.visibility = View.GONE
println(">>>>>end: $请求结束的回调<<<<<")
}
, successCallback = {
println(">>>>>success: $成功解析成实体后的回调<<<<<")
}
, cacheCallback = {
println(">>>>>cache: $如果设置了Cache注解,Cache回调会首先返回<<<<<")
}
, failedCallback = {
println(">>>>>fail: $失败的回调<<<<<")
}
)
MainRequest("10086", "Devin:$i")
.requestByLifecycle(BaseResponse::class.java
, startCallback = {
progressBar.visibility = View.VISIBLE
println(">>>>>start: $请求开始的回调<<<<<")
}
, endCallback = {
progressBar.visibility = View.GONE
println(">>>>>end: $请求结束的回调<<<<<")
}
, successCallback = {
println(">>>>>success: $成功解析成实体后的回调<<<<<")
}
, cacheCallback = {
println(">>>>>cache: $如果设置了Cache注解,Cache回调会首先返回<<<<<")
}
, failedCallback = {
println(">>>>>fail: $失败的回调<<<<<")
}
)
}