改造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<Response<LoginResponse>>
(注意:确保它是Retrofit Response<>
,而不是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我解决此问题的方法是从 okhttp3 进行调用。这样我的 onSuccess 是正确的,我得到错误消息的方式是使用
val jObjError = JSONObject(response.errorBody()!!.string())
loginLiveData.postValue(jObjError.get("message").toString())
【讨论】:
以上是关于改造2如何处理有时无效有时非无效的服务器响应的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 API 有时将属性作为数组返回,有时作为对象返回?