2010-01-15 19 views
20

Tengo algunos problemas para enviar datos POST a un script PHP con NSURLConnection. Este es mi código:iPhone enviando mensaje POST con NSURLConnection

const char *bytes = [[NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data] UTF8String]; 

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

    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]]; 

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

Y mi script.php es tan simple como esto:

<?php 
    echo $_POST['mydata']; 
?> 

Esto ha funcionado para mí en el pasado, pero por alguna razón la salida que obtiene de NSLog(@"responseData: %@", responseData); ahora es solo "<>" en lugar de "theData".

Probablemente algún error cojo en algún lado pero parece que no puedo encontrarlo? ¿Algunas ideas?

Respuesta

39

Sus datos son incorrectos. Si espera que los datos que se encuentran en la matriz $ _POST de PHP, se debe tener este aspecto:

const char *bytes = "mydata=Hello%20World"; 

Si desea enviar datos XML, es necesario establecer un diferente tipo de contenido HTTP. P.ej. podría establecer

application/xml; charset=utf-8 

Si se establece ningún tipo de contenido HTTP, el tipo predeterminado

application/x-www-form-urlencoded 

se utilizará. Y este tipo espera que los datos POST tengan el mismo formato que el que tendría en una solicitud GET.

Sin embargo, si configura un tipo de contenido HTTP diferente, como application/xml, entonces estos datos no se agregarán a la matriz $ _POST en PHP. Tendrás que leer el crudo de la corriente de entrada.

Prueba esto:

NSString * str = [NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]]; 

y en el servidor intente lo siguiente PHP:

$handle = fopen("php://input", "rb"); 
$http_raw_post_data = ''; 
while (!feof($handle)) { 
    $http_raw_post_data .= fread($handle, 8192); 
} 
fclose($handle); 

Tenga en cuenta que esto sólo funciona si la cabecera HTTP de su mensaje no es application/x-www -form-urlencoded. Si es application/x-www-form-urlencoded, PHP mismo lee todos los datos de la publicación, los decodifica (dividiéndolos en pares clave/valor) y finalmente los agrega a la matriz $ _POST.

+1

Ah sí ... aclamaciones. Pero la salida responseData es como "<48656c6c 6f326f72 6c64>", ¿no imprime NSData con% @? –

+0

gracias por [request setValue: @ "xxx" forHTTPHeaderField: @ "Content-Type"]; – Nils

+0

Hola, uso "text/xml; charset = utf-8" con HTTP Content-Type, la solicitud de envío está bien, pero utilizo "application/xml; charset = utf-8" y también voy de la mano. Content-Type de HTTP es un problema , los datos retornan: "El servidor no puede atender la solicitud porque el tipo de medio no está soportado". Entonces, ¿qué pasa? – AmyNguyen

2

Los datos POST y XML no son los mismos. Puede enviar datos XML tal como lo hizo, pero el código PHP debe analizar el XML del cuerpo de la solicitud. La xml_parse de PHP (http://php.net/manual/en/function.xml-parse.php) puede ayudarlo a hacer esto.

Alternativamente, si usted prefiere el envío de datos POST, ajuste el cuerpo de la petición así:

const char *bytes = [[NSString stringWithFormat:@"mydata=%@", data] UTF8String];

8

Ah sí ... aplausos. Pero la salida responseData es como "< 48656c6c 6f326f72 6c64>", ¿no imprime NSData con% @?- per_pilot 15 Ene '10 a 13:57

que se debe a que están mostrando los valores de "byte" debe pasar a NSString para ver el mensaje real

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 
NSLog(@"responseData: %@", string); 
7
NSString *post =[NSString stringWithFormat:@"usertype(%@),loginname(%@),password(%@)",txtuser.text,txtusername.text,txtpassword.text]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:@"http://www.dacinci.com/app/tes2/login_verify.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSError *error; 
NSURLResponse *response; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *str=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
+0

formato estándar: ... stringWithFormat: @ "usertype =% @ & loginname =% @ & password =% @" ;) – RTOSkit

2

Si uso NSURLSession entonces en iOS9 establece

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
[request addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
request.HTTPMethod = @"POST"; 

en PHP conjunto

//connection to the database 
$dbhandle = mysql_connect($hostname, $username, $password) 
    or die("Unable to connect to MySQL"); 
    echo "Connected to SQL."; 

//select a database to work with 
$selected = mysql_select_db($db,$dbhandle) 
    or die("Could not select anons db"); 
    echo "Connected to DB sucess."; 

mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'"); 
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'"); 

En db (MySql5) configure utf-8_generic.

Cuestiones relacionadas