how example consuming consume iphone cakephp rest post afnetworking

iphone - example - AFNetworking POST para REST webservice



rest swift ios (2)

Breve reseña, nuestro desarrollador anterior usó ASIHTTPRequest para realizar solicitudes POST y recuperar datos de nuestro servicio web. Por razones desconocidas, esta parte de nuestra aplicación dejó de funcionar. Parecía tiempo lo suficientemente bueno para futuras pruebas e ir con AFNetworking. El servicio web REST se ejecuta en el marco de CakePHP.

En resumen, no estoy recibiendo la cadena de respuesta de solicitud utilizando AFNetworking.

Sé que el servicio web funciona porque puedo publicar datos con éxito y recibir la respuesta adecuada con curl: curl -d "data [Model] [field0] = field0value & data [Model] [field1] = field1value" https://example.com /api/class/function.plist

Según las instrucciones del desarrollador anterior, se me ocurrió lo siguiente.

#import "AFHTTPRequestOperation.h" … - (IBAction)loginButtonPressed { NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setValue:[usernameTextField text] forHTTPHeaderField:@"data[User][email]"]; [request setValue:[passwordTextField text] forHTTPHeaderField:@"data[User][password]"]; AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]); NSLog(@"response string: %@ ", operation.responseString); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", operation.responseString); }]; [operation start]; }

salida: operación hasAceptableStatusCode: cadena de respuesta 200: un archivo plist en blanco

Solución intentada 1: Solicitud de publicación de AFNetworking La solución propuesta utiliza una función de AFHTTPRequestOperation llamada operationWithRequest. Sin embargo, cuando intento usar dicha solución, recibo una advertencia "Método de clase" + operationWithRequest: completion: "no encontrado (el tipo de retorno está por defecto ''id''"

intento de solución 2: NSURLConnection. salida: puedo imprimir el mensaje de registro de éxito pero no la cadena de respuesta. * actualización - devuelve plist en blanco.

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; NSString *httpBodyData = @"data[User][email][email protected]&data[User][password]=awesomepassword"; [httpBodyData dataUsingEncoding:NSUTF8StringEncoding]; [req setHTTPMethod:@"POST"]; [req setHTTPBody:[NSData dataWithContentsOfFile:httpBodyData]]; NSHTTPURLResponse __autoreleasing *response; NSError __autoreleasing *error; [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]; // *update - returns blank plist NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"responseData %@",str); if (error == nil && response.statusCode == 200) { // Process response NSLog(@"success");//returns success code of 200 but blank NSLog(@"resp %@", response ); } else { // Process error NSLog(@"error"); }


Estas son las líneas esenciales (eliminación de las condiciones que he hecho para mi propio uso) que terminaron satisfaciendo mi solicitud al servicio web. Gracias por las sugerencias @ 8vius y @mattt!

- (IBAction)loginButtonPressed { NSURL *baseURL = [NSURL URLWithString:@"https://www.example.com/api/class"]; //build normal NSMutableURLRequest objects //make sure to setHTTPMethod to "POST". //from https://github.com/AFNetworking/AFNetworking AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; [httpClient defaultValueForHeader:@"Accept"]; NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: [usernameTextField text], kUsernameField, [passwordTextField text], kPasswordField, nil]; NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"https://www.example.com/api/class/function" parameters:params]; //Add your request object to an AFHTTPRequestOperation AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; //"Why don''t I get JSON / XML / Property List in my HTTP client callbacks?" //see: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ //mattt''s suggestion http://.com/a/9931815/1004227 - //-still didn''t prevent me from receiving plist data //[httpClient registerHTTPOperationClass: // [AFPropertyListParameterEncoding class]]; [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; [operation setCompletionBlockWithSuccess: ^(AFHTTPRequestOperation *operation, id responseObject) { NSString *response = [operation responseString]; NSLog(@"response: [%@]",response); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", [operation error]); }]; //call start on your request operation [operation start]; [httpClient release]; }


Use AFHTTPClient -postPath:parameters:success:failure: pasando sus parámetros (los diccionarios / matrices anidados están bien). Si espera una vuelta atrás, asegúrese de que el cliente registre AFPropertyListRequestOperation .

En cualquier caso, setValue:forHTTPHeaderField: no es lo que quiere aquí. Los encabezados HTTP son para especificar información sobre la solicitud en sí misma; los datos son parte del cuerpo de la solicitud. AFHTTPClient convierte automáticamente los parámetros en una cadena de consulta para solicitudes GET o un cuerpo HTTP para POST , et al.