当使用Retrofit 2.0 Observables时出错时,如何获取Response body

ach*_*hie 30 android rx-java retrofit rx-android

我正在使用Retrofit 2.0来进行返回Observables的api调用.当呼叫完成并且响应符合预期时,一切正常.现在让我们说我们有一个错误响应,它会抛出一个onError.我想阅读响应正文,即使它是一个错误.

@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
        @Field("token") String pin
);
Run Code Online (Sandbox Code Playgroud)

当请求和响应有效时,我得到正确的observable,并在出现错误时按预期调用onError.

正确回应:

{ "status" : "authenticated" }
Run Code Online (Sandbox Code Playgroud)

Observable将其转换为正确的Observable,我可以将响应读作LoginResponse对象.

现在,错误响应如下:

{ "errorMessage" : "You need to take some xyz action" }
Run Code Online (Sandbox Code Playgroud)

我想阅读该错误响应并将消息显示给用户.我该怎么做呢?

小智 45

只需检查throwable是否是HttpException的实例,然后您就可以访问改进响应

if (e instanceof HttpException) {
    ResponseBody body = ((HttpException) e).response().errorBody();
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用转换器反序列化(或自己动手).


Aks*_*nde 12

您可以添加此代码块以显示错误消息.

@Override
public void onFailure(Throwable t) {

 if (t instanceof HttpException) {
        ResponseBody body = ((HttpException) t).response().errorBody();
        Gson gson = new Gson();
        TypeAdapter<ErrorParser> adapter = gson.getAdapter
                (ErrorParser
                        .class);
        try {
            ErrorParser errorParser =
                    adapter.fromJson(body.string());

            Logger.i(TAG, "Error:" + errorParser.getError());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Tar*_*run 5

Retrofit 返回 Throwable 对象,它是 HttpException 的一种类型。您需要做的第一步是您应该知道错误主体对象的结构。将展示如何使用 Kotlin。了解结构后,您需要创建 Error.kt 文件,如下所示:

package com.test.test.qr.data.network.responsemodel
import com.google.gson.annotations.SerializedName

data class Error(
    @SerializedName("code")
    val code: String,
    @SerializedName("message")
    val message: String
)
Run Code Online (Sandbox Code Playgroud)

现在您需要将主体从 HttpException 解析为您创建的 Error.Kt。这可以如下所示完成:

if(it is HttpException) {
    val body = it.response()?.errorBody()
    val gson = Gson()
    val adapter: TypeAdapter<Error> = gson.getAdapter(Error::class.java)
    try {
        val error: Error = adapter.fromJson(body?.string())
        Log.d("test", " code = " + error.code + " message = " + error.message)
    } catch (e: IOException) {
       Log.d("test", " Error in parsing")
    }
}
Run Code Online (Sandbox Code Playgroud)

它是您从改造中在 onError() 中获得的 Throwable。希望能帮助到你。快乐编码...:-)