objective library iphone objective-c json afnetworking nsurlrequest

iphone - library - Usando AFNetworking y HTTP Basic Authentication



alamofire objective c (1)

Respuesta actualizada para AFNetworking 2.x

Para AFNetworking 2.x:

En 2.x, eliminaron AFHTTPClient, por lo que deberá extender AFHTTPRequestOperationManager con su propia clase. Luego, puedes llamar a esa clase desde otro código. Por ejemplo, aquí hay una clase de ejemplo que extiende el AFHTTPRequestOperationManager:

SBAPIManager.h:

#import "AFHTTPRequestOperationManager.h" @interface SBAPIManager : AFHTTPRequestOperationManager - (void)setUsername:(NSString *)username andPassword:(NSString *)password; + (SBAPIManager *)sharedManager; @end

SBAPIManager.m:

#import "SBAPIManager.h" #import "AFNetworkActivityIndicatorManager.h" @implementation SBAPIManager #pragma mark - Methods - (void)setUsername:(NSString *)username andPassword:(NSString *)password { [self.requestSerializer clearAuthorizationHeader]; [self.requestSerializer setAuthorizationHeaderFieldWithUsername:username password:password]; } #pragma mark - Initialization - (id)initWithBaseURL:(NSURL *)url { self = [super initWithBaseURL:url]; if(!self) return nil; self.requestSerializer = [AFJSONRequestSerializer serializer]; [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; return self; } #pragma mark - Singleton Methods + (SBAPIManager *)sharedManager { static dispatch_once_t pred; static SBAPIManager *_sharedManager = nil; dispatch_once(&pred, ^{ _sharedManager = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:3000"]]; }); // You should probably make this a constant somewhere return _sharedManager; } @end

Luego, en tu código, puedes llamarlo así:

[[SBAPIManager sharedManager] setUsername:yourUsernameVariableHere andPassword:yourPasswordVariableHere]; [[SBAPIManager sharedManager] GET:@"/tasks.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { self.tasks = [responseObject objectForKey:@"results"]; [self.activityIndicatorView stopAnimating]; [self.tableView setHidden:NO]; [self.tableView reloadData]; NSLog(@"JSON"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // error stuff here }];

Para AFNetworking 1.x:

La mejor práctica para esto en AFNetworking es extender el AFHTTPClient con su propia clase. Luego, puedes llamar a esa clase desde otro código. Por ejemplo, aquí hay una clase de muestra que amplía el AFHTTPClient:

SBAPIManager.h:

#import "AFNetworking/AFHTTPClient.h" @interface SBAPIManager : AFHTTPClient - (void)setUsername:(NSString *)username andPassword:(NSString *)password; + (SBAPIManager *)sharedManager; @end

SBAPIManager.m:

#import "SBAPIManager.h" #import "AFJSONRequestOperation.h" #import "AFNetworkActivityIndicatorManager.h" @implementation SBAPIManager #pragma mark - Methods - (void)setUsername:(NSString *)username andPassword:(NSString *)password { [self clearAuthorizationHeader]; [self setAuthorizationHeaderWithUsername:username password:password]; } #pragma mark - Initialization - (id)initWithBaseURL:(NSURL *)url { self = [super initWithBaseURL:url]; if(!self) return nil; [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; [self setDefaultHeader:@"Accept" value:@"application/json"]; [self setParameterEncoding:AFJSONParameterEncoding]; [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; return self; } #pragma mark - Singleton Methods + (SBAPIManager *)sharedManager { static dispatch_once_t pred; static SBAPIManager *_sharedManager = nil; dispatch_once(&pred, ^{ _sharedManager = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:3000"]]; }); // You should probably make this a constant somewhere return _sharedManager; } @end

Luego, en tu código, puedes llamarlo así:

[[SBAPIManager sharedManager] setUsername:yourUsernameVariableHere andPassword:yourPasswordVariableHere]; [[SBAPIManager sharedManager] getPath:@"/tasks.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { self.tasks = [responseObject objectForKey:@"results"]; [self.activityIndicatorView stopAnimating]; [self.tableView setHidden:NO]; [self.tableView reloadData]; NSLog(@"JSON"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // error stuff here }];

El siguiente código se conecta con éxito a mi API de Ruby on Rails y devuelve JSON usando AFNetworking. ¿Qué debo hacer para editar esto para pasar un nombre de usuario y contraseña para que mi API pueda usar la autenticación básica de HTTP?

He leído su documentación, pero soy nuevo tanto en Objective-C como en AFNetworking y actualmente no tiene sentido.

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:3000/tasks.json"]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request , NSHTTPURLResponse *response , id JSON) { self.tasks = [JSON objectForKey:@"results"]; [self.activityIndicatorView stopAnimating]; [self.tableView setHidden:NO]; [self.tableView reloadData]; NSLog(@"JSON"); } failure:^(NSURLRequest *request , NSHTTPURLResponse *response , NSError *error , id JSON) { NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo); }]; [operation start];