【问题标题】:How can I access the request parameters in the onResponse and the onFailure callbacks如何访问 onResponse 和 onFailure 回调中的请求参数
【发布时间】:2019-12-12 07:54:22
【问题描述】:

我有一个 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() 回调的相同情况。

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

【问题讨论】:

    标签: android kotlin retrofit2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多