AFNetworking 2.0和HTTP基本身份验证

Mar*_*ujo 44 http-authentication ios7 afnetworking-2

在AFNetworking 2.0上找不到AFHTTPClient,使用:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com]];

[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];
Run Code Online (Sandbox Code Playgroud)

如何在AFNetworking 2.0上进行管理?

Leg*_*man 96

AFNetworking 2.0新架构使用序列化器来创建请求和解析响应.要设置授权标头,首先应初始化替换AFHTTPClient的请求操作管理器,创建序列化程序,然后调用专用方法来设置标头.

例如,您的代码将变为:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com"]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"];
Run Code Online (Sandbox Code Playgroud)

您应该阅读文档迁移指南,以了解AFNetworking 2.0版附带的新概念.

  • 另请参阅[`AFHTTPRequestOperationManager`]上的`credential`属性(http://cocoadocs.org/docsets/AFNetworking/2.0.0/Classes/AFHTTPRequestOperationManager.html#//api/name/credential) (2认同)

tit*_*coy 15

以下是使用NSURLCredential对AFNetworking 2.0执行基本HTTP身份验证的示例.这种方法优于使用AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password:方法的优点是,您可以通过更改persistence:NSURLCredential 的参数自动将用户名和密码存储在钥匙串中.(见这个答案.)

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

NSURLCredential *credential = [NSURLCredential credentialWithUser:@"user" password:@"passwd" persistence:NSURLCredentialPersistenceNone];

NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:@"https://httpbin.org/basic-auth/user/passwd" parameters:nil];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCredential:credential];
[operation setResponseSerializer:[AFJSONResponseSerializer alloc]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Failure: %@", error);
}];
[manager.operationQueue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)

  • 这对我有些要求.但是多部分请求因"请求正文流耗尽"错误而失败.我不确定没有进一步调查,但我认为您的解决方案发出一个请求,等待401响应,然后使用给定的凭据重试请求.因此,多部分请求失败,因为无法重新播放流.在AFNetworking 1.x中查看类似的问题https://github.com/AFNetworking/AFNetworking/issues/661 (4认同)
  • 对于iOS8.1和AF版本2.4.1,这对我不起作用.根本不发送授权标题.. (2认同)

jon*_*wah 6

正如@gimenete所提到的,当使用@titaniumdecoy凭证方法时,多部分请求将失败,因为这在挑战块中应用,并且当前版本的AFNetworking存在此问题.您可以将身份验证嵌入NSMutableRequest标头中,而不是使用凭据方法

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT"  URLString:path parameters:myParams constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
                    [formData appendPartWithFileData:imageData name:imageName fileName:imageName mimeType:@"image/jpeg"];
            } error:&error];    
    NSString *authStr = [NSString stringWithFormat:@"%@:%@", [self username], [self password]];
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];
Run Code Online (Sandbox Code Playgroud)

你需要使用第三方BASE64编码库,如NSData + Base64.h和.m文件来自Matt Gallaghers的ARC BASE64解决方案