刷新令牌 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)
}
我必须为 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)
}