改造2如何处理有时无效有时非无效的服务器响应

Posted

技术标签:

【中文标题】改造2如何处理有时无效有时非无效的服务器响应【英文标题】:Retrofit 2 how to handle server response that's sometimes Void sometimes Non-Void 【发布时间】:2021-12-06 08:17:48 【问题描述】:

当我通过成功的 Retrofit2 发出登录请求时,我得到一个空的正文。但是,无论出于何种原因登录失败时,响应都会返回如下 JSON 正文: message: "error message"。

问题如下,如果我这样建模调用:

 interface LoginAPIService 
    @POST("login")
    fun login(@Body body: RequestBody): Call<LoginResponse>

当返回的主体为 null 时,我会遇到 EOF 失败,但是如果我将调用建模为:

interface LoginAPIService 
    @POST("login")
    fun login(@Body body: RequestBody): Call<Void>

那么我将不会收到错误消息,必须为用户打印出来。请建议如何处理这种奇怪的情况。

【问题讨论】:

您不能将响应标记为可空吗? 【参考方案1】:

首先尝试使用Call&lt;Response&lt;LoginResponse&gt;&gt;(注意:确保它是Retrofit Response&lt;&gt;,而不是OkHttp Response)。然后你在所有情况下都会得到“成功”回调,那么你就这样做

if(it.isSuccessful) 
    return it.body
else
    parseErrorJson(it.errorBody().byteStream()) //.bytestream() for GSon, .source() for Moshi

parseErrorJson 解释错误主体的地方。

如果所有错误的格式相同,可以将类似的代码放入拦截器中。

充其量,将错误对象包装到自定义异常中并抛出它。

【讨论】:

我试过了,但是。它仍然在 onError 部分引发 EOF 异常 call.enqueue(object : Callback> override fun onFailure(call: Call>, t: Throwable) Log.d("LoginViewModel" , "出了点问题", t) loginLiveData.postValue("出了点问题") 【参考方案2】:

我解决此问题的方法是从 okhttp3 进行调用。这样我的 onSuccess 是正确的,我得到错误消息的方式是使用

val jObjError = JSONObject(response.errorBody()!!.string())
                    
loginLiveData.postValue(jObjError.get("message").toString())

【讨论】:

以上是关于改造2如何处理有时无效有时非无效的服务器响应的主要内容,如果未能解决你的问题,请参考以下文章

如何处理不受信任的服务 URL?

如何处理 API 有时将属性作为数组返回,有时作为对象返回?

如何处理 react/redux 中的请求错误?

如何处理与Apache HttpClient的无效SSL证书

如何处理无效的流标头异常:00000001?

如何处理无效的异常处理程序例程?