我正在处理一个我无法控制的API,它以JSON格式返回错误响应,但在这种情况下不返回非200响应代码.在使用Retrofit时,是否仍然可以在故障回调中获得任何错误(由"错误"属性的存在确定)?假设我可以通过查看消息内容来识别来自该API的错误响应,这是安全的.
这是应用程序级别的区别,这意味着Retrofit不会(也不应该)关心它.
有三种方法可以实现您想要的效果,每种方法都可以映射到Retrofit的行为.
对于异步调用,您可以使用Callback执行映射的自定义子类型.
public abstract class MyCallback<T extends MyResponse> implements Callback<T> {
@Override public final void success(T data, Response response) {
if (!data.success) {
success(data);
} else {
error(data.error, response);
}
// This is just an example of what a potential common handler could look like.
}
public abstract void success(T data);
public abstract void httpError(Error error, Response response);
}
Run Code Online (Sandbox Code Playgroud)如果您正在使用实验性的RxJava支持,则应该Observable通过提取错误的内容进行映射.
service.doSomething()
.map(new Func1<SomethingResponse, SomethingResponse>() {
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(..);
Run Code Online (Sandbox Code Playgroud)最后,对于同步,您显然可以检查每个调用站点,但您也可以包装API.
public final class WrappedService implements Service {
private final Service real;
@Override public SomethingResponse doSomething() {
return handleError(real.doSomething());
}
private static <T extends MyResponse> T handleError(T data) {
if (!data.success) {
throw new SomeException(data.error);
}
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
(提示:您也可以使用a Proxy自动为每个方法执行此操作!)
这里要记住的重要一点是,Retrofit的职责是将您的HTTP API映射到Java API.它不负责将应用程序级行为或约束应用于请求或响应数据.这仍然是你的责任.
| 归档时间: |
|
| 查看次数: |
2644 次 |
| 最近记录: |