【发布时间】:2021-08-08 10:28:58
【问题描述】:
我想以这样一种方式设计 API 调用,以便从一个地方轻松处理成功和失败响应(而不是为所有 API 编写相同的调用函数代码)
这是我想考虑的场景。
- 在一个中心位置处理所有 API 的成功/失败和错误响应,例如 4xx、5xx 等。
- 想要取消入队请求,并且在注销时如果请求已经发送也停止处理响应(因为响应解析会修改应用的一些全局数据)
- 如果访问令牌已过期并从云端收到 401 响应,则应获取新令牌,然后使用新令牌自动再次调用 API。
我当前的实现不满足上述要求。 有没有办法使用 Retrofit 实现满足上述要求的 API 调用? 请为此建议我一个好的设计。
这是我目前的实现:
- ApiInterface.java - 它是一个包含不同 API 调用定义的接口。
- ApiClient.java - 获取改造客户端对象以调用 API。
- ApiManager.java - 它具有调用 API 并解析其响应的方法。
ApiInterface.java
public interface ApiInterface {
// Get Devices
@GET("https://example-base-url.com" + "/devices")
Call<ResponseBody> getDevices(@Header("Authorization) String token);
// Other APIs......
}
ApiClient.java
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();
}
}
ApiManager.java
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 进行异步调用? (注意:此调用不是改造调用)
【问题讨论】:
标签: android performance design-patterns architecture retrofit