Problema AFNetworking con respuesta: no autorizado (401)

He utilizado AFNetworking en mi proyecto, cada vez que envío una request, estoy recibiendo este post en un bloque de falla,

Error Domain = com.alamofire.error.serialization.response Code = -1011 "Solicitud fallida: no autorizada (401)" UserInfo = {com.alamofire.serialization.response.error.response = com.alamofire.serialization.response.error. datos = <7b227375 63636573 73223a66 616c7365 2c226d65 73736167 65223a22 41757468 656e7469 63617469 6f6e2066 61696c65 64227d>, NSLocalizedDescription = Solicitud fallida: no autorizada (401)}

Así es como envío la request utilizando AFNetworking.

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL]]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil]; NSString *path = [NSString stringWithFormat:@"/api/##/##/##/sign_in"]; NSString *params = @"{\"user\": {\"uid\": \"10236412002551\",\"access_token\":\"g6tdbvc34seadcx7yufbbcgvf8ijhss\",\"email\": \"user@domain1.com\",\"latitude\": \"6.927079\", \"longitude\": \"79.861243\",\"remote_avatar_url\": \"\"}}"; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [policy setValidatesDomainName:NO]; [policy setAllowInvalidCertificates:YES]; [manager POST:path parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { if([[responseObject objectForKey:@"error_code"] intValue]==0){ if (success) { success(userArray); } } } failure:^(NSURLSessionDataTask *task, NSError *error) { if (failure) { failure(error); } }]; } 

Pero si puedo get la respuesta correcta utilizando NSURLSession. (Consulte el código siguiente)

  NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; NSURL * url = [NSURL URLWithString:@"http://##/api/##/##/##/sign_in"]; NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; NSString * params =@"{\"user\": {\"uid\": \"10236412002551\",\"access_token\":\"g6tdbvc34seadcx7yufbbcgvf8ijhss\",\"email\": \"user@domain1.com\",\"latitude\": 6.927079, \"longitude\": 79.861243,\"remote_avatar_url\": \"\"}}"; [urlRequest addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"Response:%@ %@\n", response, error); if(error == nil) { NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"Data = %@",text); NSLog(@"Data = %@",json); } }]; [dataTask resume]; 

Estoy interesado en usar AFNetworking, pero debido a este problema no podré seguir adelante. Ayúdame a corregir el problema con AFNetworking.

Esta es la request que debo enviar,

 { "user": { "uid": "102364120025511", "access_token": "g6tdbvc34seadcx7yufbbcgaavf8ijh", "email": "user@domain.com", "latitude": 6.927079, "longitude": 79.861243, "remote_avatar_url": "" } } 

Esta es la respuesta que debería recibir,

 { "success": true, "message": "Successfully authenticated", "user": { "id": 123, "email": "user@domain.com", "provider": "facebook", "latitude": 6.927079, "longitude": 79.861243, "avatar": { "url": "", "thumb": "" } } } 

Está proporcionando sus params como una cadena JSON y luego orderando a AFNetworking que use un AFJSONRequestSerializer para luego representar esa cadena en una estructura JSON. El efecto neto es que has JONIFICADO esto dos veces.

Debe proporcionar un object de dictionary y dejar que AFNetworking cree el JSON para usted, por ejemplo:

 NSString *params = @{@"user": @{@"uid": @"10236412002551", @"access_token": @"g6tdbvc34seadcx7yufbbcgvf8ijhss", @"email": @"user@domain1.com", @"latitude": @6.927079, @"longitude": @79.861243, @"remote_avatar_url": @""}}; 

Por cierto, dejar que AFNetworking (que usa NSJSONSerialization ) construya el JSON para usted será mucho más sólido que si intentara hacerlo usted mismo. Por lo tanto, incluso si utiliza el enfoque NSURLSession , sugiero crear esta estructura de dictionary anidada y luego usar NSJSONSerialization para build la carga de datos de JSON. O, si usa AFNetworking, lo hará por usted.