2010-03-30 8 views
16

Soy bastante nuevo en objective-c, y estoy buscando pasar un número de pares clave-valor a un script PHP utilizando POST. Estoy usando el siguiente código, pero parece que los datos no se publican. Intenté enviar cosas mediante el uso de NSData también, pero ninguno parece estar funcionando.Usando NSURLRequest para pasar pares clave-valor al script PHP con POST

NSDictionary* data = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"bob", @"sender", 
    @"aaron", @"rcpt", 
    @"hi there", @"message", 
    nil]; 

NSURL *url = [NSURL URLWithString:@"http://myserver.com/script.php"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; 

    NSURLResponse *response; 
    NSError *err; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    NSLog(@"responseData: %@", content); 

Esto se está poniendo enviados a este sencillo script para realizar una inserción db:

<?php $sender = $_POST['sender']; 
     $rcpt = $_POST['rcpt']; 
     $message = $_POST['message']; 

     //script variables 
     include ("vars.php"); 

     $con = mysql_connect($host, $user, $pass); 
     if (!$con) 
     { 
     die('Could not connect: ' . mysql_error()); 
     } 

     mysql_select_db("mydb", $con); 

     mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
     VALUES ($sender, $rcpt, $message)"); 

     echo "complete" 
?> 

¿Alguna idea?

+1

Gracias a pinkgothic, ahora soy cita que encierra mi instrucción de inserción, sin embargo, sólo está agregando valores en blanco con el PP . Supongo que esto significa que los valores todavía no se publican correctamente. –

Respuesta

36

Gracias por las sugerencias de todos. Al final logré resolver el problema usando cosas dadas here.

Código:

NSString *myRequestString = @"sender=my%20sender&rcpt=my%20rcpt&message=hello"; 
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ]; 
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString: @"http://people.bath.ac.uk/trs22/insert.php" ] ]; 
[ request setHTTPMethod: @"POST" ]; 
[ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 
NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"responseData: %@", content); 
0

Editar: Se ha corregido en OP.


esto puede no ser el único problema (no sé mi camino alrededor de Objective-C), pero aquí va:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ($sender, $rcpt, $message)"); 

No te cito-encerrando sus cadenas - MySQL está obligado a tener un ataque de risa sobre eso.

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('$sender', '$rcpt', '$message')"); 

Más allá de eso, en general, incluso si la secuencia de comandos no es accesible desde el exterior, no se debe confiar en la entrada del usuario y, o bien utiliza mysql_real_escape_string() para escapar de sus valores antes de insertarlos en la instrucción SQL para evitar la inyección de SQL o use prepared statements (preferido); de lo contrario, las comillas simples en sus datos legítimos romperán la sintaxis de la declaración SQL.

ejemplo enteramente sin gracia como referencia:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('" . mysql_real_escape_string($sender) ."'," 
." '" . mysql_real_escape_string($rcpt) ."'," 
." '" . mysql_real_escape_string($message) ."')"); 
2

Esta línea se ve [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; manera equivocada de mí.

Creo que desee: [request setAllHTTPHeaderFields:data];

En segundo lugar, se encuentra el marco de cacao en mayúscula la primera letra de los nombres de los campos antes de enviarlos (molesto). Es posible que deba hacer algunos cambios para hacer frente a eso.

+0

miedo no - ahora yo estoy haciendo: 400 Bad Request

400 Bad Request

Su cliente ha emitido una solicitud mal formada o ilegal. atrás del sendSynchronousRequest: método. ¿Hay algún otro campo de encabezado que deba enviar para cumplir con HTTP? –

2

Si va a hacer un montón de publicación de formularios, recomendaría omitir NSURLRequest y usar ASIHTTPRequest en su lugar. En mi humilde opinión, está bien documentado y ofrece una manera directa de interactuar con los servicios web.

+0

gracias, pero no buscando usarlo más que esto una vez en todo el proyecto realmente. Aunque me gusta el aspecto de lo fácil que es publicar cosas. –

4

Esto está mal:

[NSData dataWithBytes:[post UTF8String] length:[post length]] 

La longitud debe ser expresado en bytes, no en el recuento de caracteres UTF8. En lugar de esta línea se debe utilizar:

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
+0

Intenté casi todo, todo estaba en esta cuerda. ¡Gracias! – blackhawk4152

1

Esto está trabajando en IOS 5.o para Formato de Mensajes y obtener los datos:

self.requestFor = serviceNameT; 

responseData = [[NSMutableData data] retain]; 

SharedResponsedObject* sharedResponsedObject = [SharedResponsedObject returnSharedInstance]; 
LoginInfo* loginInfo = (LoginInfo*)sharedResponsedObject.loginInfo; 

NSLog(@"DEVICE_TOKEN: %@, loginInfo.sessionId: %@, itemIdT: %@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT); 

NSString* requestStr = [NSString stringWithFormat:@"Token=%@&SessionId=%@&ItemId=%@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT]; 


NSData *myRequestData = [ NSData dataWithBytes: [ requestStr UTF8String ] length: [ requestStr length ] ]; 

NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://menca.com:1500/DownloadContent.aspx"]]; 

[request setHTTPMethod: @"POST" ]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 


NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"ServerRequestResponse::responseData: %@", content); 

Gracias & Saludos, Arun Dhwaj

Cuestiones relacionadas