使用Retrofit 2.0 Observables时出现错误时如何获取Response body
How do I get Response body when there is an error when using Retrofit 2.0 Observables
我正在使用 Retrofit 2.0 进行 api 调用 return Observables。当通话顺利进行并且响应符合预期时,一切都很好。现在假设我们有一个错误响应,它会抛出一个 onError。即使是错误,我也想阅读响应正文。
例子
@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
@Field("token") String pin
);
当请求和响应有效时,我得到正确的可观察对象,并且在出现错误时按预期调用 onError。
正确答案:
{ "status" : "authenticated" }
Observable 将其转换为正确的 Observable,我可以将响应读取为 LoginResponse 对象。
现在,错误响应如下:
{ "errorMessage" : "You need to take some xyz action" }
我想阅读该错误响应并将消息显示给用户。我该怎么做?
只需检查 throwable 是否是 HttpException 的实例,然后您就可以访问改造响应
if (e instanceof HttpException) {
ResponseBody body = ((HttpException) e).response().errorBody();
...
}
那你可以使用converter to deserialize it(或者自己动手)
您可以添加此代码块来显示错误消息。
@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();
}
}
}
改造returns 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
)
现在您需要将正文从 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")
}
}
改造后在 onError() 中得到的 Throwable 在哪里。希望能帮助到你。快乐编码...:-)
我正在使用 Retrofit 2.0 进行 api 调用 return Observables。当通话顺利进行并且响应符合预期时,一切都很好。现在假设我们有一个错误响应,它会抛出一个 onError。即使是错误,我也想阅读响应正文。
例子
@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
@Field("token") String pin
);
当请求和响应有效时,我得到正确的可观察对象,并且在出现错误时按预期调用 onError。
正确答案:
{ "status" : "authenticated" }
Observable 将其转换为正确的 Observable,我可以将响应读取为 LoginResponse 对象。
现在,错误响应如下:
{ "errorMessage" : "You need to take some xyz action" }
我想阅读该错误响应并将消息显示给用户。我该怎么做?
只需检查 throwable 是否是 HttpException 的实例,然后您就可以访问改造响应
if (e instanceof HttpException) {
ResponseBody body = ((HttpException) e).response().errorBody();
...
}
那你可以使用converter to deserialize it(或者自己动手)
您可以添加此代码块来显示错误消息。
@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();
}
}
}
改造returns 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
)
现在您需要将正文从 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")
}
}
改造后在 onError() 中得到的 Throwable 在哪里。希望能帮助到你。快乐编码...:-)