web-dev-qa-db-fra.com

Envoi d'iPhone POST avec NSURLConnection

J'ai des problèmes avec l'envoi de données POST vers un script PHP avec NSURLConnection. Voici mon code:

    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);

Et mon script.php est aussi simple que cela:

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

Cela a fonctionné pour moi dans le passé, mais pour une raison quelconque, la sortie que j'obtiens de NSLog(@"responseData: %@", responseData); est maintenant juste "<>" au lieu de "theData".

Probablement une erreur boiteuse quelque part mais je n'arrive pas à la trouver? Des idées?

21
per_pilot

Vos données sont fausses. Si vous vous attendez à ce que les données soient trouvées dans le tableau $ _POST de PHP, elles devraient ressembler à ceci:

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

Si vous souhaitez envoyer des données XML, vous devez définir un type de contenu HTTP différent. Par exemple. vous pourriez définir

application/xml; charset=utf-8

Si vous ne définissez aucun type de contenu HTTP, le type par défaut

application/x-www-form-urlencoded

sera utilisé. Et ce type s'attend à ce que les données POST aient le même format que dans une demande GET.

Cependant, si vous définissez un type de contenu HTTP différent, comme application/xml, ces données ne sont pas ajoutées au tableau $ _POST en PHP. Vous devrez lire le brut du flux d'entrée.

Essaye ça:

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]];

et sur le serveur essayez le PHP suivant:

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

Veuillez noter que cela ne fonctionne que si l'en-tête HTTP de votre POST n'est pas application/x-www-form-urlencoded. Si c'est application/x-www-form-urlencoded alors PHP lui-même lit toutes les données de publication, les décode (les divise en paires clé/valeur) et les ajoute finalement au tableau $ _POST.

39
Mecki

Ah ouais ... bravo. Mais la sortie responseData est comme "<48656c6c 6f326f72 6c64>", n'imprimez-vous pas NSData avec% @? - per_pilot 15 janvier 10 à 13:57

c'est parce que vous montrez les valeurs "octets" que vous devriez le passer à NSString pour voir le vrai message

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
8
Alex
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];
7
Mehul Joisar

Les données POST et les données XML ne sont pas identiques. Vous pouvez envoyer des données XML comme vous l'avez fait, mais le code PHP doit analyser le XML du corps de la demande. Xml_parse de PHP ( http://php.net/manual/en /function.xml-parse.php ) peut vous y aider.

Alternativement, si vous préférez envoyer des données POST, définissez le corps de la demande comme suit:

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

2
Aaron

Si vous utilisez NSURLSession alors dans iOS9 set

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";

Dans PHP set

//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'");

Dans la base de données (MySql5), définissez utf-8_generic.

2
dip