概述
最近又要替換網路庫成了,導致所有的業務代碼都要替換且要重新測驗回歸,為了防止后續再遇到這樣事情,降低替換核心庫的成本,現利用協程對網路庫進行封裝,
理想API呼叫方式
launch {
val response = TestReq(q = "電腦").request<TestResponse>()
Toast.makeText(this, response?.result?.toString()?:"網路例外", Toast.LENGTH_SHORT).show()
}
請求定義
@URL("https://suggest.taobao.com/sug")
@GET
data class TestReq(var code: String = "utf-8", val q: String) : IReq
class TestResponse {
var result: List<Any>? = null
}
說明
launch是對Context的類擴展,對于Activity而言可以在銷毀的時候關閉協程;其他場景可以自己管理協程,例如:
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() , CoroutineScope by MainScope() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch {
val response = TestReq(q = "電腦").request<TestResponse>()
Toast.makeText(this@MainActivity, response?.result?.toString()?:"網路例外", Toast.LENGTH_SHORT).show()
}
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
使用
參考
implementation 'com.zhangzheng.easyhttp:library:1.0.1'
初始化
默認(HttpUrlConnection)
EasyHttp.init(DefaultAdapter(GsonJsonParse()))
implementation 'com.google.code.gson:gson:2.8.6'
OkHttp
EasyHttp.init(OKHttpAdapter(GsonJsonParse()))
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
implementation 'com.squareup.okio:okio:1.12.0'
implementation 'com.google.code.gson:gson:2.8.6'
Vollery
EasyHttp.init(VolleyAdapter(this,GsonJsonParse()))
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.google.code.gson:gson:2.8.6'
如果使用的是FastJson可以替換決議器
GsonJsonParse() --> FastJsonParse()
implementation 'com.alibaba:fastjson:1.2.37'
如果協程不可用,檢查協程庫是否引入了
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
自定義擴展
自己擴展可以實作EasyHttp.IAdapter,對于后續替換網路請求核心庫只需要開發配接器就可以了,對于json決議可以實作IResponseParse來擴展,示例如下:
IAdapter
class OKHttpAdapter(var parse: IResponseParse) : EasyHttp.IAdapter {
override suspend fun request(url: String, params: Map<String, String>, isGet: Boolean): String {
val okHttpClient = OkHttpClient()
val formBody = FormBody.Builder()
params.forEach {
formBody.add(it.key,it.value)
}
val request: Request =if(isGet){
Request.Builder().url(url.urlWithParam(params)).method("GET", null)
}else{
Request.Builder().url(url).method("POST", createParamBody(params))
}.build()
val call: Call = okHttpClient.newCall(request)
return call.execute().body()?.string()?:""
}
override fun <T> parse(value: String, clazz: Class<T>)=parse.parse(value,clazz)
private fun createParamBody(params: Map<String, String>):FormBody{
val formBody = FormBody.Builder()
params.forEach {
formBody.add(it.key,it.value)
}
return formBody.build()
}
}
IResponseParse
class FastJsonParse :IResponseParse{
override fun <T > parse(value: String, clazz: Class<T>)=JSON.parseObject(value,clazz)
}
github地址:https://github.com/long8313002/EasyHttp
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/126536.html
標籤:AI
下一篇:向Portal Server發送請求超時。 抱歉,您暫時不能使用Portal Web認證進行寬帶上網,請與管理員聯系。
