我正在尝试在我的iOS应用中使用REST API。我知道它有效,因为我可以进行一次登录请求。每个后续请求都会因401错误而失败。即使我从模拟器中删除了应用程序,在我将模拟器类型更改为之前未使用过的模拟器类型(即iPad 2,iPhone6等)之前,它仍然无法再次调用。我也可以使用像https://www.hurl.it这样的服务,根据我的喜好,使用相同的参数来生成相同的请求。我正在使用AFNetworking
和AFHTTPRequestOperationManager
。我做错了什么?
self.manager = [[AFHTTPRequestOperationManager alloc]initWithBaseURL:[NSURL URLWithString:@"https://api.mydomain.com/"]];
[self.manager POST:@"services/json/user/login" parameters:@{@"username":@"USERNAME", @"password":@"PASSWORD"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (![responseObject isKindOfClass:[NSDictionary class]]) { return; }
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSDictionary* json = responseObject;
self.sessionName = json[@"session_name"];
self.sessionId = json[@"sessionid"];
[defaults setObject:self.sessionName forKey:@"SessionNameKey"];
[defaults setObject:self.sessionId forKey:@"SessionIDKey"];
if (completion) { completion(); }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Session request failed: %@", error.userInfo);
}];
答案 0 :(得分:1)
如果首次登录成功,您应该获得一些access_token
,您可以将其与随后的任何电话一起发送。
答案 1 :(得分:1)
如果API具有基本身份验证,则需要在HTTP标头中传递凭据。 要在标头中设置凭据,您可以使用以下方法:
[self.manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"];
答案 2 :(得分:0)
(未经授权)401表示您无权访问该服务。确保您尝试使用正确的凭据。显然,代码没有任何问题。
答案 3 :(得分:0)
使用获取授权的Swift 2.0更新iOS9
我遇到了同样的问题,实际上sessionManager.session.configuration.HTTPAdditionalHeaders
被iOS9上的requestSerializer
覆盖,导致401 Access拒绝错误。
适用于iOS8的代码,但不适用于iOS9:
sm.session.configuration.HTTPAdditionalHeaders = ["Authorization" : "Bearer \(token!)"]
iOS9的新代码
sm.requestSerializer.setValue("Bearer \(token!)", forHTTPHeaderField: "Authorization")