gpt4 book ai didi

java - 在 Android Studio 中的 Retrofit2 回调中等待请求

转载 作者:行者123 更新时间:2023-12-02 09:03:54 25 4
gpt4 key购买 nike

我尝试在应用程序中改进请求和自定义回调以使其变得更好。当我登录时,我的后端会为用户生成一个 token 。每隔 X 秒/分钟,我的 token 就会被弃用,当我发出新请求时,我需要生成/刷新新 token 。

我遇到的问题是,当 token 被弃用时,我无法在请求之前生成新的 token 。

MainActivity.java

ApiService mApiService = RetrofitClientInstance.getRetrofitInstance().create(ApiService.class);

Call < Data > call = mApiService.getData(config.token, params); //My actual token and some custom parameters

call.enqueue(new MyCallback < Data > () {
@Override
public void onResponse(Call < Data > call, Response < Data > response) {
super.onResponse(call, response);
config.data = response.body(); //configuration class where I store the result of the request
startActivity(new Intent(this, NewActivity.class);
}

@Override
public void onFailure(Call < Data > call, Throwable t) {
super.onFailure(call, t);
}
});

MyCallback.java

public class MyCallback < T > implements Callback < T > {

private String TAG = "MyCallback";
private ApiService mApiService = ConnectionsRequest.getApiService();
@Override
public void onResponse(Call < T > call, Response < T > response) {
if (new Gson().toJson(response.body()).contains("needrefreshtoken")) {
Log.i(TAG, "Generate new token");
mApiService.getRefreshToken(config.login.getRefreshToken()).enqueue(new Callback() {
@Override
public void onResponse(Call < RefreshToken > call, Response < RefreshToken > response) {
config.token = response.body().getNewToken();
Log.i(TAG, "New token generated");
}

@Override
public void onFailure(Call < RefreshToken > call, Throwable t) {
super.onFailure(call, t);
}
});
}

}

@Override
public void onFailure(Call < T > call, Throwable t) {
Log.e(TAG, t.toString());
}
}

看起来我在刷新 token 请求之前(或期间)执行了主要请求。

如何改进我的代码以逐步执行此操作(刷新 token 然后执行主请求)?

感谢您的帮助。

最佳答案

在使用动态 header 集成( token )时,我们记住以下事项。

  1. 当我们使用应用程序时, token 可能随时过期
  2. API 中出现错误 401。

所以我们需要在调用api时检测token过期的回调,所以我们使用Authendicator,它会在我们的api收到401时触发(如果您已经使用api发送token,请添加authenticator类)。

如果出现 401,请调用刷新 api,然后使用新 token 再次调用现有 api。

validator :

class TokenAuthenticator implements Authenticator {

@Nullable
@Override
public Request authenticate(@NonNull Route route, @NonNull Response response) throws IOException {
//call your refersh token api

//returned new request with updated header
return response.request().newBuilder()
.header("AUTHORIZATION", "new token from refresh token api")
.build();
}
}

然后将Authendicator添加到您的okhttp客户端

 .authenticator(new TokenAuthenticator())

关于java - 在 Android Studio 中的 Retrofit2 回调中等待请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59968382/

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