尽管有 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 中看到 codemessage 等,如下所示:

(为简洁起见,已删除部分 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