Soru AFNetworking 2.0 ve HTTP Temel Kimlik Doğrulaması


Kullanmak için AFNetworking 2.0'da AFHTTPClient bulunamıyor:

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

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

AFNetworking 2.0'da nasıl yönetilmesi gerekiyor?


44
2017-09-30 19:37


Menşei




Cevaplar:


AFNetworking 2.0 yeni mimarisi, istekleri oluşturmak ve yanıtları çözümlemek için serializer kullanıyor. Yetkilendirme üstbilgisini ayarlamak için, önce AFHTTPClient'in yerini alan bir istek işlem yöneticisi başlatmalı, bir seri hale getirici oluşturmalı ve sonra üstbilgiyi ayarlamak için özel yöntemi çağırmalısınız.

Örneğin, kod şöyle olur:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com"]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"];

Okumalısın belgeleme ve taşıma rehberi AFNetworking'in 2.0 sürümü ile gelen yeni kavramları anlamak.


95
2017-10-01 08:48



Ayrıca bkz. credential mülk AFHTTPRequestOperationManager - David Snabel-Caunt
Teşekkürler David, ilk yöntem benim için çalışmadı. - Legoless
Kimlik bilgilerinin işe yaramayacağını onaylayabilir. Atanan herhangi bir şeyi yok sayar. - Michael
İOS7'den iOS8'e geçerken bu soruna girdim. Bazı nedenlerden dolayı, iOS8'de, yetkilendirme başlığını açıkça belirtmem gerekiyordu; iOS7'de kimlik bilgileri yalnızca URL’de bırakılıyordu ("kullanıcı: pw@example.com") gayet iyi çalışıyordu. - FishStix
Not etmek önemlidir: setAuthorizationHeaderFieldWithUsername:password: Base64 kullanarak kodlayacak. Sunucunuz farklı bir şifre çözme işlemi kullanarak şifresini çözüyorsa, bu durum işe yaramazsa, sunucunuzu Base64 kullanarak şifresini yapılandıramazsınız. - Brandon A


NSELCredential kullanarak AFNetworking 2.0 ile temel HTTP kimlik doğrulaması gerçekleştirme örneği. AFHTTPRequestSerializer kullanarak bu yaklaşımın avantajı setAuthorizationHeaderFieldWithUsername:password: yöntem, anahtar sözcüğündeki kullanıcı adı ve şifreyi otomatik olarak değiştirerek persistence: NSURLCredential parametresi. (Görmek bu cevap.)

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
2018-01-05 22:18



oldukça kullanışlı, teşekkürler. - EmilDo
Bu, bazı istekler için benim için çalıştı. Ancak çok parçalı istekler, "istek akışı" akışı "hatasıyla başarısız oldu. Daha fazla araştırma yapmadan emin değilim, ama çözümünüzün bir istekte bulunduğunu, 401 yanıtı beklediğini ve ardından talebi belirtilen kimlik bilgileriyle yeniden denediğini düşünüyorum. Dolayısıyla, çok parçalı istekler başarısız olur, çünkü akış yeniden oynatılamaz. AFNetworking 1.x'te benzer bir soruna bakın. github.com/AFNetworking/AFNetworking/issues/661 - gimenete
İOS8.1 ve AF sürüm 2.4.1 ile bu benim için çalışmaz. Yetkilendirme başlığını hiç göndermiyor .. - Brynjar


@Gimenete'den bahsedildiği gibi, çoktan gelen talepler, @titaniumdecoy kimlik bilgisi yaklaşımı kullanılırken, bu, deneme bloğunda uygulandığından ve AFNetworking'in mevcut sürümünün bununla ilgili bir sorunu olduğu için başarısız olur. Kimlik bilgisi yaklaşımını kullanmak yerine, kimlik doğrulamasını NSMutableRequest üstbilgisine yerleştirebilirsiniz

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

Burada NSData + Base64.h ve .m File gibi bir üçüncü taraf BASE64 kodlama kütüphanesi kullanmanız gerekecek Matt Gallaghers ön ARC BASE64 çözümü


6
2017-07-12 13:01



ANet sorunuyla ilgili AFNetworking sorununu belirtmek için +1. - user623396