尽管有 rawResponse,但 Retrofit2 中的 errorBody() returns null
errorBody() returns null in Retrofit2 despite a rawResponse
也许我不了解apis或Retrofit2,但是当我得到一个500 Internal Server Error
时,我想适当地通知用户。
当我在收到此错误后记录传入响应时,我得到 null
当我这样记录时:
Gson g = new Gson();
Log.d(TAG, g.toJson(response.errorBody()));
但是,当我记录我的回复时,我在 rawResponse
中看到 code
、message
等,如下所示:
(为简洁起见,已删除部分 JSON)
{
"rawResponse":{
"body":{
"contentLength":0,
"contentType":{
"mediaType":"text/html",
"subtype":"html",
"type":"text"
}
},
"code":500,
"headers":{
"namesAndValues":[ ]
},
"message":"Internal Server Error",
"networkResponse":{
"code":500,
"headers":{ },
"message":"Internal Server Error",
"protocol":"HTTP_1_1",
"receivedResponseAtMillis":1509415428600,
"request":{ },
"sentRequestAtMillis":1509415428428
},
"protocol":"HTTP_1_1",
"receivedResponseAtMillis":1509415428600,
"request":{ },
"sentRequestAtMillis":1509415428428
}
}
所以我不明白的是,response.errorBody
从哪里得出?
对于不成功的响应,errorBody 只是正文本身。
这可以通过查看 Retrofit 源代码来验证 - Response.java
/** Create an error response from {@code rawResponse} with {@code body} as the error body. */
public static <T> Response<T> error(ResponseBody body, okhttp3.Response rawResponse) {
checkNotNull(body, "body == null");
checkNotNull(rawResponse, "rawResponse == null");
if (rawResponse.isSuccessful()) {
throw new IllegalArgumentException("rawResponse should not be successful response");
}
return new Response<>(rawResponse, null, body);
}
private final okhttp3.Response rawResponse;
private final @Nullable T body;
private final @Nullable ResponseBody errorBody;
private Response(okhttp3.Response rawResponse, @Nullable T body,
@Nullable ResponseBody errorBody) {
this.rawResponse = rawResponse;
this.body = body;
this.errorBody = errorBody;
}
所以在上面的例子中,代码是 500,这是不成功的,正文是空的。
同样的空体被初始化为 errorBody ,因此你得到 null
也许我不了解apis或Retrofit2,但是当我得到一个500 Internal Server Error
时,我想适当地通知用户。
当我在收到此错误后记录传入响应时,我得到 null
当我这样记录时:
Gson g = new Gson();
Log.d(TAG, g.toJson(response.errorBody()));
但是,当我记录我的回复时,我在 rawResponse
中看到 code
、message
等,如下所示:
(为简洁起见,已删除部分 JSON)
{
"rawResponse":{
"body":{
"contentLength":0,
"contentType":{
"mediaType":"text/html",
"subtype":"html",
"type":"text"
}
},
"code":500,
"headers":{
"namesAndValues":[ ]
},
"message":"Internal Server Error",
"networkResponse":{
"code":500,
"headers":{ },
"message":"Internal Server Error",
"protocol":"HTTP_1_1",
"receivedResponseAtMillis":1509415428600,
"request":{ },
"sentRequestAtMillis":1509415428428
},
"protocol":"HTTP_1_1",
"receivedResponseAtMillis":1509415428600,
"request":{ },
"sentRequestAtMillis":1509415428428
}
}
所以我不明白的是,response.errorBody
从哪里得出?
对于不成功的响应,errorBody 只是正文本身。
这可以通过查看 Retrofit 源代码来验证 - Response.java
/** Create an error response from {@code rawResponse} with {@code body} as the error body. */
public static <T> Response<T> error(ResponseBody body, okhttp3.Response rawResponse) {
checkNotNull(body, "body == null");
checkNotNull(rawResponse, "rawResponse == null");
if (rawResponse.isSuccessful()) {
throw new IllegalArgumentException("rawResponse should not be successful response");
}
return new Response<>(rawResponse, null, body);
}
private final okhttp3.Response rawResponse;
private final @Nullable T body;
private final @Nullable ResponseBody errorBody;
private Response(okhttp3.Response rawResponse, @Nullable T body,
@Nullable ResponseBody errorBody) {
this.rawResponse = rawResponse;
this.body = body;
this.errorBody = errorBody;
}
所以在上面的例子中,代码是 500,这是不成功的,正文是空的。 同样的空体被初始化为 errorBody ,因此你得到 null