首页 > 解决方案 > 如何访问 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() 回调的相同情况。

我可以在这些情况下访问原始请求吗?如果有怎么办?

标签: androidkotlinretrofit2

解决方案


一旦我遇到了同样的问题。我的方法是调试改造回调的 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()
        }
    }

您可以进行尽可能多的修改以使其看起来更好,并利用优化的轻量级线程。这是我处理这种情况的方法之一。这只是一个提示,您可以修改以在您的项目中获得结构和架构上正确的设计。


推荐阅读