我正在利用Retrofit + Moshi为应用程序设置网络层,它将具有约40个网络请求,所有这些请求均以一致的格式返回JSON数据。因此,我想重用处理$invoke.name | Select-String -Pattern ^puppet_.*\:\:'(\w+)'\:\:'(\w+)'$ |
foreach {$_.Matches.Groups[1].Value} | Sort-Object | Unique`
中的onFailure
和onResponse
的代码。
例如,后端可能返回以下内容:
成功:
Callback<T>
错误:
{
"result" {
"count": 0
},
"error": null
}
请注意,{
"result" null,
"error": {
"message": "Some user-friendly error message here."
}
}
的内容对于每个成功请求都会有所不同,并且成功和错误情况的状态码均为200。
我目前有一个要求正在反序列化为以下类别:
"result"
我发出请求并像这样处理它
@JsonClass(generateAdapter = true)
data class SampleWrapper(
val error: APIError?,
val result: Sample?
)
@JsonClass(generateAdapter = true)
data class Sample(
val count: Int
)
并在活动中调用此函数:
fun requestSample(context: Context, callback: (Sample?, String?) -> Unit) {
service.sample.enqueue(object : Callback<SampleWrapper> {
//TODO: Use a generic function to handle these and pass back Sample? and String?
override fun onFailure(call: Call<SampleWrapper>, t: Throwable) {
callback(null, t.message?: context.getString(R.string.unexpected_error_message))
}
override fun onResponse(call: Call<SampleWrapper>, response: Response<SampleWrapper>) {
if (response.isSuccessful && response.body() != null && response.body()?.error == null) {
callback(response.body()!!.result, null)
} else {
callback(null, response.body()?.error?.message?: context.getString(R.string.unexpected_format_error_message))
}
}
})
}
我现在想重用响应处理,因为除了回调中传递的对象类型之外,所有请求都将完全相同。看来我基本上需要处理Networking.requestSample(this) { sample, errorMessage ->
//work with sample or handle error
}
,其中Callback<T>
包含T
和error
的值,但是也许我需要使该包装对象通用。我正在努力弄清楚如何实现这一目标。本质上,我想简化该函数,以便为每个需要定义的请求都简洁,因此我们不会将重复的代码重复40倍,例如:
result