android - 如何访问 onResponse 和 onFailure 回调中的请求参数
问题描述
我有一个 Retrofit 调用,我想在调用 API 时处理 HTTP 和 Retrofit 错误。
因此,当发生故障时,我需要将请求缓存到 RoomDB/SQLite 中,以便 API 重新联机或连接改善时,有一个例程将所有这些请求发送到 API。
x.enqueue(object : Callback<PayloadResponse> {
override fun onResponse(
call: Call<PayloadResponse>,
response: Response<PayloadResponse>
) {
...
val errorMessage = when {
response.code() != HttpURLConnection.HTTP_OK -> {
// Need the original Payload here so I can insert that data into RoomDB/SQLite
"An error occured duing API Call (NOT OK) &{response.code()}"
}
...
我需要 onFailure() 回调的相同情况。
我可以在这些情况下访问原始请求吗?如果有怎么办?
解决方案
一旦我遇到了同样的问题。我的方法是调试改造回调的 onResponse 和 onFailure 的第一个参数。
call: Call<PayloadResponse>
call.request()
它包含有关您的呼叫/请求的所有类型的信息,例如 url、参数、方法。但是,检索请求数据并不简单、一致且容易出现错误。
然后,我开始使用 Kotlin 协程,它提供了具有编码同步性质的异步进程。
interface RetrofitApi{
@GET("your-route")
suspend fun sampleApiMethod(request:SampleRequest):Response<SampleCustomObject>
}
您的改造 api 方法可能如上所示。
CoroutineScope(Dispatchers.Main).launch {
val request = SampleRequest()
val deferred = async { apiService.sampleApiMethod(request) }
val result = deferred.await()
if(result.code() == 200){
// Do something
}else{
// Cache SampleRequest()
}
}
您可以进行尽可能多的修改以使其看起来更好,并利用优化的轻量级线程。这是我处理这种情况的方法之一。这只是一个提示,您可以修改以在您的项目中获得结构和架构上正确的设计。
推荐阅读
- python - 如何添加到变量,然后在达到最大值后循环回 0?
- ansible - terraform apply 后在远程控制节点上执行 ansible playbook
- sse - 128/256 位是否有 1 条指令移位?
- swift - 当我考虑锚点(0.5,0.5)时,为什么我的 SKSpriteNode 会移动这么远?
- python-3.x - Numba 正确实施?
- python-3.x - Python中连接坐标的排序列表
- firebase - 使用 Firebase Cloud Functions,我可以从外部 API 安排更新以更新 Firestore
- azure-devops - 如何将私有 nuget 源的凭据添加到 Azure DevOps Pipelines?
- javascript - 列表文本不会通过 Javascript 按钮更改颜色
- c - C函数替换参数的特定索引中的字节