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);
}
}
我正在使用 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);
}
}