2012-03-29 13 views
8

Breve reseña histórica, 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.AFNetworking POST to REST webservice

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

Sé el servicio web funciona porque soy capaz de colocar correctamente los datos y recibir la respuesta adecuada utilizando rizo: rizo -d "de datos [modelo] [] = Field0 field0value & datos [Modelo] [campo1] = 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]; 

} 

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

intento de solución 1: AFNetworking Post Request la solución propuesta utiliza una función de AFHTTPRequestOperation llama operationWithRequest. Sin embargo, cuando trato de usar dicha solución recibo una advertencia "Class method" + operationWithRequest: completion: 'not found (tipo de retorno por defecto' id '"

intento de solución 2: NSURLConnection. Output: soy capaz para imprimir el registro de éxito, pero no contactado a la cadena de respuesta * actualización -.. retornos 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"); 
} 
+0

Hola, Pouria, ¿has intentado utilizar NSURLConnection para enviar una solicitud sincrónica? – 8vius

+0

intento solución 2: es como probé NSURLConnection. – Airuop

+0

¿Tiene todo lo que está en el lado del servidor configurado correctamente? Al igual que el análisis de extensión, los diseños para la respuesta y las vistas para ellos? Parece más un problema de servidor que uno de cliente. – 8vius

Respuesta

18

Estas son las líneas esenciales (que elimino las condiciones que he hecho para mi propio uso) que terminaron por satisfacer 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://stackoverflow.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]; 
} 
+0

Registrarse para las operaciones plist solo afecta las operaciones de solicitud creadas usando 'AFHTTPClient -HTTPRequestOperationWithRequest: success: failure:'. 'alloc init'-ing' AFHTTPRequestOperation' siempre le dará un 'AFHTTPRequestOperation'. – mattt

+0

gracias, @mattt! – Airuop

+0

@pouria, ¿Qué es el Camino aquí? Es como una misma URL. Por favor, ayúdame, me quedé atrapado en Path. –

6

uso AFHTTPClient -postPath:parameters:success:failure:, pasando sus parámetros (anidadas diccionarios/matrices están bien) Si usted está esperando un plist espalda. , asegúrese de hacer que el cliente se registre AFPropertyListRequestOperation.

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

+0

Resolví este problema, pero tengo la sensación de que todavía estoy haciendo algo mal o de manera ineficiente. Le agradecería enormemente que echase un vistazo rápido a mi solución. ¡Gracias! – Airuop

Cuestiones relacionadas