php iphone objective-c cocoa-touch nsurlrequest

Uso de NSURLRequest para pasar pares clave-valor a un script PHP con POST



iphone objective-c (6)

Esta línea [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; me parece mal.

Creo que quieres: [request setAllHTTPHeaderFields:data];

En segundo lugar, encontrará que el marco de Cocoa escribe en mayúscula la primera letra de sus nombres de campo antes de enviarlos (de manera molesta). Es posible que tenga que hacer algunos cambios para hacer frente a eso.

Soy bastante nuevo en object-c, y estoy buscando pasar una cantidad de pares clave-valor a un script PHP usando POST. Estoy usando el siguiente código, pero parece que los datos no se están publicando. Intenté enviar cosas mediante el uso de NSData también, pero ninguno parece estar funcionando.

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á enviando a este simple 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" ?>

¿Algunas ideas?


Esto está mal:

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

La longitud debe expresarse en bytes sin contar con caracteres UTF8. En lugar de esta línea debes usar:

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding];


Esto está trabajando en IOS 5.o para la publicación de formularios y la obtención de 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 y Saludos, Arun Dhwaj


Gracias a todos por las sugerencias. Al final logré resolver el problema usando las cosas que se dan 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);


Si va a hacer un montón de publicación de formularios, le recomiendo que omita NSURLRequest y use ASIHTTPRequest lugar. En mi humilde opinión, está bien documentado y ofrece una forma sencilla de interactuar con los servicios web.


Edición : Se ha corregido en OP.

Puede que este no sea su único problema (no conozco el objetivo-c), pero aquí va:

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

No estás encerrado entre comillas, MySQL está obligado a tener un ajuste sibilante por eso.

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

Más allá de eso, generalmente, incluso si su script no es accesible desde el exterior, no debe confiar en las entradas del usuario y usar mysql_real_escape_string() para escapar de sus valores antes de insertarlos en la declaración SQL para evitar la inyección de SQL, o usar declaraciones preparadas (preferido): de lo contrario, las comillas simples en sus datos legítimos romperán la sintaxis de la declaración SQL.

Ejemplo totalmente ingrato para 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) ."'')");