我在我的iOS应用中使用Restkit来调用API。
首次启动应用时,会从API中检索客户端令牌,以便调用该服务发布新用户。
成功创建此用户后,API会发回一个新的访问令牌。这次是用户令牌。
应用程序对API发出的所有其他请求现在都必须使用此用户令牌。
我使用的是继承自RKObjectManager的单例类。然后,我为每个ressource构建了一个类来访问(例如:Users,Images,...),这些类都继承自名为AKObjectManager的主类。
在AKObjectManager中,我有以下方法:
+ (instancetype)sharedManager
{
NSURL *url = [NSURL URLWithString:LLY_API_BASE_URL];
AKObjectManager *sharedManager = [self managerWithBaseURL:url];
sharedManager.requestSerializationMIMEType = RKMIMETypeJSON;
...
// Access Token
NSUserDefaults* userData = [NSUserDefaults standardUserDefaults];
if ([userData objectForKey:@"accessToken"]) {
// Not too sure if this is being taken into account for the other class that inherits
[ sharedManager.HTTPClient setDefaultHeader:@"Authorization" value:[userData objectForKey:@"accessToken"]];
}
return sharedManager;
}
我认为通过检查NSUserDefaults中的accessToken并在标头的Authorization字段中设置它的每次访问都可以,但是没有。我可以通过NSLog看到新的访问令牌在更改时因为某些原因而设置使用Charles,请求的标题仍然指向旧的。
然后我用
[[AKObjectManager sharedManager].HTTPClient setDefaultHeader:@"Authorization" value:accessToken.accessToken];
我一收到新令牌但面临同样的问题。
最后我走了那条路(UserManager继承自AKObjectManager)
// Force the newly refresh token to be set in the Authorization header
[[UserManager sharedManager].HTTPClient setDefaultHeader:@"Authorization" value:[[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"]];
[[UserManager sharedManager] show:nil // userId equals nil meaning it will be replaced by 'self'
success:^(User* user){
self.user = user;
...
它有效,但我对实施不太满意。
你能指出我错在哪里并建议怎么做吗?