刷新令牌 api 如何调用并继续 Retrofit2 中的 apis

How do Refresh token api call and continue the apis in Retrofit2

我必须为 api 调用实施 Retrofit2。在尝试实现拦截器以执行刷新令牌 api 调用并继续当前 api cals 时, 我们无法执行 authtoken 失败检查,因为响应如下所示

{
    "error": "invalid_grant",
    "error_description": "Token needs refresh",
    "mode": "dev",
    "needs_refresh": true,
    "statusCode": 400,
    "success": false,
    "url": "/transactions"
}

我们如何在拦截器中处理此响应并执行刷新令牌 api 调用。

这就是我的拦截器的样子。我想检查密钥 "needs_refresh" 以执行 getNewToken()

override fun intercept(chain: Interceptor.Chain?): Response {
        var request = chain!!.request()
        var response = chain.proceed(request)

        if(response.code()==400) {

           getNewToken()
        }
        val token: String = MyApp.prefs[PrefConstants.KEY_PREF_ACCESS_TOKEN,""]
        if(!token.isEmpty())
        request = request?.newBuilder()
                ?.header("Authorization", "Bearer " + token)
                ?.build()
        else
            request = request?.newBuilder()
                    ?.build()
        return chain.proceed(request)
    }

我建议你使用 okhttp 和 retrofit,

class NetworkInterceptor @Inject constructor(val context: Context) : Interceptor {

override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        var response = request.proceed(request)
        if(response?.code()==400){
            //you can refresh your token here and chain your calls 
         }
     return response;
   }
}

为您的回复创建一个模型 class。

public class ResponseModel{

@SerializedName("mode")
private String mode;

@SerializedName("needs_refresh")
private boolean needsRefresh;

@SerializedName("error_description")
private String errorDescription;

@SerializedName("success")
private boolean success;

@SerializedName("error")
private String error;

@SerializedName("url")
private String url;

@SerializedName("statusCode")
private int statusCode;

public void setMode(String mode){
    this.mode = mode;
}

public String getMode(){
    return mode;
}

public void setNeedsRefresh(boolean needsRefresh){
    this.needsRefresh = needsRefresh;
}

public boolean isNeedsRefresh(){
    return needsRefresh;
}

public void setErrorDescription(String errorDescription){
    this.errorDescription = errorDescription;
}

public String getErrorDescription(){
    return errorDescription;
}

public void setSuccess(boolean success){
    this.success = success;
}

public boolean isSuccess(){
    return success;
}

public void setError(String error){
    this.error = error;
}

public String getError(){
    return error;
}

public void setUrl(String url){
    this.url = url;
}

public String getUrl(){
    return url;
}

public void setStatusCode(int statusCode){
    this.statusCode = statusCode;
}

public int getStatusCode(){
    return statusCode;
}

}

更新了您的拦截

override fun intercept(chain: Interceptor.Chain?): Response {
        
        var request = chain!!.request()
        var response = chain.proceed(request)

        var responseModel = ResponseModel()
        var gson = Gson();
       

        if(response.getCode() == 400) {
 responseModel = gson.fromJson(response.body()?.string(), ResponseModel::class.java);
if(responseModel.isNeedsRefresh()){
            getNewToken()
}
        }
        val token: String = MyApp.prefs[PrefConstants.KEY_PREF_ACCESS_TOKEN,""]
        if(!token.isEmpty())
        request = request?.newBuilder()
                ?.header("Authorization", "Bearer " + token)
                ?.build()
        else
            request = request?.newBuilder()
                    ?.build()
        return chain.proceed(request)
    }