AFNetworking到REST API返回401

时间:2015-01-27 05:14:48

标签: ios rest afnetworking

我正在尝试在我的iOS应用中使用REST API。我知道它有效,因为我可以进行一次登录请求。每个后续请求都会因401错误而失败。即使我从模拟器中删除了应用程序,在我将模拟器类型更改为之前未使用过的模拟器类型(即iPad 2,iPhone6等)之前,它仍然无法再次调用。我也可以使用像https://www.hurl.it这样的服务,根据我的喜好,使用相同的参数来生成相同的请求。我正在使用AFNetworkingAFHTTPRequestOperationManager。我做错了什么?

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);
}];

4 个答案:

答案 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")