概観
最近、ネットワークライブラリを再び置き換える必要があり、すべてのビジネスコードが置き換えられ、再テストされ、リグレッションが発生しています。このような事態が今後発生するのを防ぎ、コアライブラリを置き換えるコストを削減するために、ネットワークライブラリはコルーチンを使用してカプセル化されています。
理想的な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'
ボレリー
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