Retrofit:请求失败时获取原始响应体

Retrofit: Get original response body when request fails

我正在使用 Retrofit (1.6.1) 和 Robospice (1.4.14) 从某些服务中获取数据(响应应该在 JSON 中)。

在某些情况下,我可能会收到 HTML 错误页面而不是 JSON 响应。服务器 returns 一个 200 状态代码,我无法更改它。在这种情况下,RoboSpice 将调用 onRequestFailure(SpiceException) 方法。

在那里,我能够得到原始的 RetrofitError 异常,但是正文是 null。我是这样得到的:

if (spiceException.getCause() instanceof RetrofitError) {
    RetrofitError error = (RetrofitError) spiceException.getCause();
    error.getBody(); // returns null
}

查了Retrofit的源码,发现如果转换失败body会被替换成null(这里是这样的,Retrofit expect JSON and receives HTML).

RestAdapter 中的以下行是我问题的根源:

response = Utils.replaceResponseBody(response, null);

有没有办法不将正文设置为null?在另一个 SO 问题中,我发现如果服务器 returns 4xx,主体会保留,但我无法更改它。

您可能应该创建一个改进的方法,它只会 return 一个 retrofit.client.Response 并在响应主体采用必要的格式时手动调用转换。

您的 Retrofit 界面:

...
@GET("/foo/bar")
Response fooBarMethod(Object foo, Object bar);
...

您的 RoboSpice 请求:

...
@Override
public final FooBar loadDataFromNetwork() throws Exception {
    Response r = getService().fooBarMethod(foo, bar);
    if (isBodyInHtmlFormat()) {
        // cool stuff
        throw new ResponseIsHtmlException();
    } else {
        // it is wise to make sure that it is 
        // exactly the same converter you are passing to
        // your RetrofitSpiceService
        Converter converter = createGsonConverter();
        return (FooBar) converter.fromBody(response.getBody(), FooBar.class);
    }
}