Se busca: Ejemplo actualizado para JSON / POST con authentication básica utilizando AFNetworking-2

Tengo una aplicación de juguete que envía un https JSON / POST usando security de authentication básica. Me han dicho que debería considerar usar AFNetworking. Pude instalar AFNetwork-2 en mi proyecto XCode (ios7 target, XCode5) muy bien. Pero ninguno de los ejemplos parece ser relevante para las versiones actuales de AFNetworking-2, sino versiones anteriores. Los documentos AFNetworking son bastante escasos, así que estoy luchando para juntar las piezas. El código que no es AFNetworking tiene el siguiente aspecto:

NSURL *url = [NSURL URLWithString:@"https://xxx.yyy.zzz.aaa:bbbbb/twig_monikers"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 10.0]; NSData *requestData = [NSJSONSerialization dataWithJSONObject: [self jsonDict] options: 0 error: nil]; [request setHTTPMethod: @"POST"]; [request setValue: @"application/json" forHTTPHeaderField: @"Accept"]; [request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"]; [request setValue:[NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField: @"Content-Length"]; NSData *plainPassText = [@"app_pseudouser:sample_password" dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64PassText = [plainPassText base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength]; [request setValue:[NSString stringWithFormat: @"Basic %@", base64PassText] forHTTPHeaderField: @"Authorization"]; FailedCertificateDelegate *fcd=[[FailedCertificateDelegate alloc] init]; NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO]; [c setDelegateQueue:[[NSOperationQueue alloc] init]]; [c start]; NSData *data=[fcd getData]; if (data) NSLog(@"Submit response data: %@", [NSString stringWithUTF8String:[data bytes]]); 

No estoy buscando a alguien que escriba mi código para mí. Parece que no puedo imaginar cómo asignar las partes AFNetworking-2 a eso. Cualquier enlace, o ejemplos, o explicaciones son bienvenidos.

ACTUALIZACIÓN 1

Lo anterior es una versión no AF que se sabe que funciona. Mover tratando de get todo de una vez, acabo de intentar:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"app_pseudouser" password:@"sample_password"]; AFHTTPRequestOperation *operation = [manager PUT: @"https://172.16.214.214:44321/twig_monikers" parameters: [self jsonDict] success:^(AFHTTPRequestOperation *operation, id responseObject){ NSLog(@"Submit response data: %@", responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error){ NSLog(@"Error: %@", error);} ]; 

Que produce el siguiente error:

 2013-10-09 11:41:38.558 TwigTag[1403:60b] Error: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn't be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x1662c1e0 {NSErrorFailingURLKey=https://172.16.214.214:44321/twig_monikers, NSErrorFailingURLStringKey=https://172.16.214.214:44321/twig_monikers} 

Viendo en el lado del server, nada lo hace. No sé si es porque https, o qué, pero puedo volcar la aplicación de nuevo al código original, y todo funciona bien.

ACTUALIZACIÓN: Se encontró que la parte JSON de lo siguiente funcionaba para PUT / POST, pero NO para GET / HEAD / ELLE

Después de algunas disputas, y ayuda fuera de SO, obtuve algo de trabajo, que quería dejar como recuerdo. Al final, quedé muy impresionado con AFNetworking-2. Fue muy simple, seguí tratando de hacerlo más difícil de lo que debería haber sido. Dado un método jsonDict que devuelve el package json para enviar, creé lo siguiente:

 - (void) submitAuthenticatedRest_PUT { // it all starts with a manager AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // in my case, I'm in prototype mode, I own the network being used currently, // so I can use a self generated cert key, and the following line allows me to use that manager.securityPolicy.allowInvalidCertificates = YES; // Make sure we a JSON serialization policy, not sure what the default is manager.requestSerializer = [AFJSONRequestSerializer serializer]; // No matter the serializer, they all inherit a battery of header setting APIs // Here we do Basic Auth, never do this outside of HTTPS [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"basic_auth_username" password:@"basic_auth_password"]; // Now we can just PUT it to our target URL (note the https). // This will return immediately, when the transaction has finished, // one of either the success or failure blocks will fire [manager PUT: @"https://101.202.303.404:5555/rest/path" parameters: [self jsonDict] success:^(AFHTTPRequestOperation *operation, id responseObject){ NSLog(@"Submit response data: %@", responseObject);} // success callback block failure:^(AFHTTPRequestOperation *operation, NSError *error){ NSLog(@"Error: %@", error);} // failure callback block ]; } 

3 instrucciones de configuration, seguidas de 2 posts, realmente es así de fácil.

EDITAR / AÑADIR: Aquí hay un ejemplo @jsonDict implementación:

 - (NSMutableDictionary*) jsonDict { NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; result[@"serial_id"] = self.serialID; result[@"latitude"] = [NSNumber numberWithDouble: self.location.latitude]; result[@"longitude"] = [NSNumber numberWithDouble: self.location.longitude]; result[@"name"] = self.name; if ([self hasPhoto]) { result[@"photo-jpeg"] = [UIImageJPEGRepresentation(self.photo, 0.5) base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength]; } return result; 

}

Simplemente debería devolver un dictionary con keys de cadena y objects simples como valores (NSNumber, NSString, NSArray (creo), etc.). El codificador JSON hace el rest por ti.