45

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

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

[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

在 AFNetworking 2.0 上需要如何管理?

4

3 回答 3

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"];

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

于 2013-10-01T08:48:17.843 回答
15

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

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];
于 2014-01-05T22:18:02.623 回答
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"];

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

于 2014-07-12T13:01:58.480 回答