只有一些 api 调用需要令牌。当 401 发生时,将进行刷新令牌调用。对于每次调用,令牌都会刷新。401发生时如何同步执行1个以上的api
问问题
1785 次
1 回答
1
这取决于你,你如何设计流程,但我做了几乎同样的问题,就像在 Objective C 中一样
- 在我的情况下调用类似userProfileGETRequest的方法
- 在调用userProfileGETRequest之前检查令牌是否过期(在您的情况下可能是状态码 == 401)
- 如果令牌未过期,只需在我的情况下使用最后一个令牌调用 API userProfileAPI
- 如果令牌过期,则调用刷新令牌并带有成功和失败回调
如果成功刷新令牌,请使用更新的刷新令牌调用userProfileAPI API。
+ (void) userProfileGETRequest:(NSDictionary *)headerParams urlQuery: (NSString*)action parameters:(NSDictionary*)params docOpenPassword: (NSString*)password docOpenOtp: (NSString*)otp onComplete:(void (^)(id json, id code, id url))successBlock onError:(void (^)(id error, id code, id url))errorBlock {if ([[SingletonSDK sharedInstance] isTokenExpired:[NSDate date]]) {[self refereshToken:nil :^(id json, id code) { [[SingletonSDK sharedInstance] handleLoginResponseObject:json]; [self userProfileAPI:headerParams urlQuery:action parameters:params onComplete:^(id json, id code, id url) { successBlock(json, code, url); } onError:^(id error, id code, id url) { errorBlock(error, code, url); }]; } onError:^(id error, id code) { [[SingletonSDK sharedInstance] hideProgessHud]; return ; }]; } } else { [self userProfileAPI:headerParams urlQuery:action parameters:params onComplete:^(id json, id code, id url) { successBlock(json, code, url); } onError:^(id error, id code, id url) { errorBlock(error, code, url); }]; }}
//userProfileAPI 方法
+ (void) userProfileAPI:(NSDictionary *)headerParams urlQuery: (NSString*)action parameters:(NSDictionary*)params
onComplete:(void (^)(id json, id code, id url))successBlock
onError:(void (^)(id error, id code, id url))errorBlock
{
NSString *authorizationValue = [self setAuthorizationValue:action];
NSString *language = [self editedLanguageNameAsApiRequired];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//set headers values
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:language forHTTPHeaderField:@"Accept-Language"];
[manager.requestSerializer setValue:authorizationValue forHTTPHeaderField:@"authorization"];
[manager GET:action parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"getRequest response success");
NSString *url = [[[operation response] URL] absoluteString];
NSInteger statusCode = [operation.response statusCode];
NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
successBlock(responseObject, statusObject, url);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSString *url = [[[operation response] URL] absoluteString];
NSInteger statusCode = [operation.response statusCode];
NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
if ([self takeDesiredActionIfAccessTokenExpired:statusCode]) {
return ;
}
id responseObject = operation.responseData;
id json = nil;
id errorMessage = nil;
if ([statusObject integerValue] == 404) {
errorMessage = [[SingletonSDK sharedInstance] getStringValueFromLanguageKey: COMMON_ERROR_SHARED_PREFERENCES];//NSLocalizedString(COMMON_ERROR_RESOURCE_NOT_FOUND, nil);
} else {
if (responseObject) {
json = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:&error];
errorMessage = [(NSDictionary*)json objectForKey:@"Message"];
}else{
json = [error.userInfo objectForKey:NSLocalizedDescriptionKey];
errorMessage = json;
}
}
if(![errorMessage isKindOfClass:[NSString class]]){
errorMessage = [[SingletonSDK sharedInstance] getStringValueFromLanguageKey: COMMON_ERROR_MSG] ; //NSLocalizedString(COMMON_ERROR_MSG, nil);
}
}];
}
于 2018-04-06T11:01:13.697 回答