使用不同类型的响应改造错误处理

Posted

技术标签:

【中文标题】使用不同类型的响应改造错误处理【英文标题】:Retrofit Error Handling with different types of responses 【发布时间】:2021-12-21 23:26:59 【问题描述】:

对于两种不同的情况,我有两种不同的反应。一种情况是我得到一个 JSONArray 作为响应

 [ 
        "type" : "cat",       
        "color": "black"
      , 
      
        "type" : "cat",
        "color": "white"
       ]

这是我应该得到的正常反应。但如果响应不适用于我发送的正文,我会收到以下响应。

 "message" : "response not available for this date" 

这是我的发帖请求

@POST("user/userTimetable")
    fun getTypeApi(@HeaderMap headers: Map<String, String>, @Body body: ScheduleBody?) : Call <List<Type>>

当我得到后一个响应时,我遇到了崩溃

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

如何在 kotlin 上处理这种类型的响应?

【问题讨论】:

【参考方案1】:

Retrofit 不会预测响应,因此要么将结果类型设置为 ResponseBody 并使用对象类型,要么更改后端以发送实现错误消息和数据的默认情况。

【讨论】:

【参考方案2】:

我曾经遇到过这个问题,请按照下面的代码进行操作

    创建一个名为 ErrorResponse 的模型类,它将返回上面的数据并修改为仅显示您的消息响应。

    创建一个名为 ErrorResponseService 的类,该类将用于将 ErrorMessage 映射到返回的响应。

    然后在您的 Retrofit 调用中执行此实现,以在您的响应失败时获取错误消息。

【讨论】:

尽量不要使用截图来展示代码。 我们在哪里执行第 3 步?不是很清楚 在你的 onResponse 回调中使用它,一旦你检查了 response.isSuccessful 然后使用上面的代码来映​​射你的响应来显示你的错误信息 由于我提到的崩溃,它不会进入 onResponse 回调。它进入 onFailure 回调。我尝试将 getTypeApi 的返回类型更改为 ErrorResponse,然后进入 onResponse 回调。

以上是关于使用不同类型的响应改造错误处理的主要内容,如果未能解决你的问题,请参考以下文章

改造图片上传无法处理的实体错误

通过在改造中透明地发送另一个请求来处理特定错误

Kotlin 使用协程处理改造请求

自定义呼叫适配器改造中的通用类型

错误响应上的 REST-API 不同的内容类型

Android rxJava 错误处理与改造