改造:请求失败时获取原始响应正文

时间:2015-03-31 09:06:59

标签: android retrofit robospice

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

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

在那里,我能够获得原始的RetrofitError激发,但身体是null。这就是我得到它的方式:

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

在调查了Retrofit的源代码之后,我发现如果转换失败,那么正文将替换为null(在这里就是这种情况,因为Retrofit期望JSON并接收HTML)。

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

response = Utils.replaceResponseBody(response, null);

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

1 个答案:

答案 0 :(得分:1)

如果响应主体采用必要的格式,您应该创建一个只需返回retrofit.client.Response并手动调用转换的改进方法。

您的改造界面:

...
@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);
    }
}