使用RxJava2CallAdapter处理Retrofit2中的不同响应格式

时间:2018-10-18 08:29:10

标签: android retrofit2

我正在呼叫一个端点,该端点以两种不同的格式发送响应:

  • { field1: VALUE, field2: VALUE }(如果响应代码为2XX)
  • { message: ERROR_MESSAGE }(如果响应代码为4XX)

我正在使用的POJO:

data class MyResponse(
    @SerializedName("field1") field1: String?,
    @SerializedName("field2") field2: String?,
    @SerializedName("message") message: String?
)

我正在使用RxJava2CallAdapter,因此,我的服务界面如下:

interface MyService {

    @POST(...)
    fun makeCall(@Body body: JsonObject): Single<MyResponse>
}

问题是,如果响应代码为4XX,则出现错误,而不是仅填充MyResponse字段的message对象。

我想要的是一种使状态代码为:

  • 2XX,我可以访问field1field2
  • 4XX,我可以访问message

当我订阅makeCall()的返回值时

1 个答案:

答案 0 :(得分:0)

您的响应中包含一个errorBody值。因此,在您的回复中,您需要执行以下操作:

if(response.code() == 200) {
    //Success, continue as normal with your POJO
} else {
    ResponseBody errorBody = response.errorBody();
}

errorBody可以转换为其中包含您的{ message: ERROR_MESSAGE }的JSON对象。

 try {
        JSONObject object = new JSONObject(errorBody.string());
        errorMessage = object.getString("message");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }