-6ren">
gpt4 book ai didi

android - 使用 RxAndroid 根据特定错误消息改造获取授权 token

转载 作者:行者123 更新时间:2023-12-05 00:21:53 27 4
gpt4 key购买 nike

我有一堆改造 observables,每个请求的 header 中都需要授权 token 。 token 有一个小时的到期时间。

@GET("objects/abc")
Observable<List<Object>> apiCustomView(@Query("isMobileViews") boolean isMobileViews);

这是我的改造服务类,其中为每个请求提供授权 token 。
class Factory {
public static RetrofitService create() {
Interceptor interceptor = chain -> {
Request newRequest = chain.request().newBuilder().addHeader("Authorization",
"Bearer "+ Util.getSharedPref("token")).build();
return chain.proceed(newRequest);
};

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
OkHttpClient client = builder.build();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://url.com/api/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(RetrofitService.class);
}
}

这是使用服务来获取数据 -
retrofitService.apiCustomView(isMobileViews)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(application.defaultSubscribeScheduler())
.subscribe(new Subscriber < List < Object >> () {
@Override
public void onCompleted() {
if (!mObjects.isEmpty()) {
// Add to database and present data
}
}

@Override
public void onError(Throwable error) {
// Present Data from Database
}

@Override
public void onNext(List < Object > objectList) {
mObjects = objectList;
}
});

我想以这样一种方式修改请求,即每当我收到授权失败错误时,我都会获取授权 token 并恢复相同的请求。对于任何其他类型的错误,我想显示保存的数据。

最佳答案

您可以通过更改 Observable 的返回类型来访问 Retrofit 的网络响应:

@GET("objects/abc")
Observable<Response<List<Object>>> apiCustomView(@Query("isMobileViews") boolean isMobileViews);

然后您可以在平面图中检查错误类型:
retrofitService.apiCustomView(isMobileViews)
.flatMap(new Func1<Response<List<Object>>, Observable<List<Object>() {
@Override
public Observable<List<Object>> call(Response<List<Object>> response) {

if (response.isSuccess()) {
return Observable.just(response.body());
}
else if (response.code() == 403) {
// get new auth token and try again
return getNewAuthKeyAndTryAgain();
}
else {
return Observable.error(/* create an exception*/)
}
}
})
.subscribeOn(application.defaultSubscribeScheduler())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);

要获取新的身份验证 token 并再次运行请求,我将创建一个执行此操作的函数:
private Observable<List<Object>> getNewAuthKeyAndTryAgain() {

return retrofitService
.getNewKey()
.flatMap(new Func1<String, Observable<Response<List<Object>>>>() {
@Override
public Observable<Response<List<Object>>> call(String s) {

// save key where you need to
return retrofitService.apiCustomView(isMobileViews);
}
})
.flatMap(new Func1<Response<List<Object>>, Observable<List<Object>>>() {
@Override
public Observable<List<Object>> call(Response<List<Object> response) {
return response.body();
}
});
}

关于android - 使用 RxAndroid 根据特定错误消息改造获取授权 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37588208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com