我正在使用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,则保留正文,但我无法改变它。
答案 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);
}
}