web-dev-qa-db-ja.com

AFNetworking 2.0およびHTTP基本認証

AFNetworking 2.0でAFHTTPClientが見つかりません。使用するには:

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

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

AFNetworking 2.0でどのように管理する必要がありますか?

44
Marckaraujo

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に付属する新しい概念を理解するには、 ドキュメント および 移行ガイド を読む必要があります。

96
Leguman

NSURLCredentialを使用してAFNetworking 2.0で基本的なHTTP認証を実行する例を次に示します。 AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password:メソッドを使用するよりもこのアプローチの利点は、NSURLCredentialの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];
15
titaniumdecoy

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

Matt Gallaghers pre ARC BASE64 solution のNSData + Base64.hや.m FileなどのサードパーティBASE64エンコーディングライブラリを使用する必要がある場合

6
joneswah