使用RetrofitAndroid对多个API进行常见成功/失败/错误处理的良好设计
我想以这样一种方式设计 API 调用,以便从一个地方轻松处理成功和失败响应(而不是为所有 API 编写相同的调用函数代码)
以下是我想考虑的场景。
- 在一个中心位置处理所有 API 的成功/失败和错误响应,如 4xx、5xx 等。
- 想要取消入队请求,并且如果请求已经发送,则在注销的情况下也停止处理响应(因为响应解析会修改应用程序的一些全局数据)
- 如果访问令牌已过期并且从云收到 401 响应,它应该获取新令牌,然后使用新令牌自动再次调用 API。
我目前的实现不满足上述要求。有没有办法使用 Retrofit 实现满足上述要求的 API 调用?请为我推荐一个好的设计。
这是我目前的实现:
- ApiInterface.java - 它是一个包含不同 API 调用定义的接口。
- ApiClient.java - 获取改造客户端对象以调用 API。
- ApiManager.java - 它具有调用 API 并解析其响应的方法。
接口接口.java
public interface ApiInterface {
// Get Devices
@GET("https://example-base-url.com" + "/devices")
Call<ResponseBody> getDevices(@Header("Authorization) String token);
// Other APIs......
}
客户端程序
public class ApiClient {
private static Retrofit retrofitClient = null;
static Retrofit getClient(Context context) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), systemDefaultTrustManager())
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
retrofitClient = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
}
接口管理器
public class ApiManager {
private static ApiManager apiManager;
public static ApiManager getInstance(Context context) {
if (apiManager == null) {
apiManager = new ApiManager(context);
}
return apiManager;
}
private ApiManager(Context context) {
this.context = context;
apiInterface = ApiClient.getClient(context).create(ApiInterface.class);
}
public void getDevices(ResponseListener listener) {
// API call and response handling
}
// Other API implementation
}
更新 :
对于第一点,拦截器将有助于根据this全局处理 4xx、5xx 响应。但是拦截器将在 ApiClient 文件中并通知 UI 或 API 调用者组件,需要在回调中传递成功或失败结果我的意思是响应侦听器。我怎样才能做到这一点 ?任何的想法 ?
对于第三点,我对 Retrofit 知之甚少Authenticator。我认为这一点是合适的,但它需要同步调用才能使用刷新令牌获取新令牌。如何对 synchronous 进行异步调用?(注意:此调用不是改造调用)
THE END
二维码