Как обновить вызов API токена и продолжить API в Retrofit2 - PullRequest
0 голосов
/ 11 марта 2019

Я должен реализовать Retrofit2 для вызовов API.И, пытаясь реализовать перехватчик для выполнения вызова API токена обновления и продолжения текущих api-файлов, мы не можем выполнить проверку неуспешного аутентификации, поскольку ответ такой, как показано ниже

{
    "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)
    }

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Создайте один класс модели для вашего ответа, как показано ниже.

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)
    }
1 голос
/ 11 марта 2019

Предлагаю использовать охттп вместе с дооснащением,

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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...