2010-01-15 14 views
20

Ich habe einige Probleme beim Senden von POST-Daten an ein PHP-Skript mit NSURLConnection. Dies ist mein Code:iPhone sendet POST mit 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); 

Und mein script.php ist so einfach wie diese:

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

Das ist für mich in der Vergangenheit gearbeitet haben, aber aus irgendeinem Grund die Ausgabe ich von NSLog(@"responseData: %@", responseData); jetzt ist nur "<>" anstelle von "theData".

Wahrscheinlich einige lahme Fehler irgendwo, aber ich kann es nicht finden? Irgendwelche Ideen?

Antwort

39

Ihre Daten sind falsch. Wenn Sie die Daten zu finden in der $ _POST Array von PHP erwarten, sollte es so aussehen:

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

Wenn Sie XML-Daten senden möchten, müssen Sie einen anderen HTTP-Content Type einzustellen. Z.B. könnten Sie

application/xml; charset=utf-8 

gesetzt Wenn Sie keine HTTP Content Type gesetzt, den Standardtyp

application/x-www-form-urlencoded 

verwendet wird. Und dieser Typ erwartet, dass die POST-Daten das gleiche Format haben wie in einer GET-Anfrage.

Wenn Sie jedoch einen anderen HTTP-Inhaltstyp wie application/xml festlegen, werden diese Daten nicht zum PHP-Array $ _POST hinzugefügt. Sie müssen das rohe aus dem Eingabestream lesen.

Try this:

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

und auf dem Server versuchen, die folgende PHP:

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

Bitte beachten Sie, dass dies nur funktioniert, wenn die HTTP-Header der POST ist nicht application/x-www -form-urlencodiert. Wenn es application/x-www-form-urlencoded ist, liest PHP selbst alle Post-Daten, dekodiert sie (teilt sie in Schlüssel/Wert-Paare auf) und fügt sie schließlich dem $ _POST-Array hinzu.

+1

Ah ja ... Prost. Aber die responseData-Ausgabe ist wie "<48656c6c 6f326f72 6c64>", drucken Sie nicht NSData mit% @? –

+0

danke für [Anfrage setValue: @ "xxx" forHTTPHeaderField: @ "Content-Type"]; – Nils

+0

Hallo, ich benutze "text/xml; charset = utf-8" mit HTTP Content-Type, sendende Anfrage ist ok aber ich benutze "application/xml; charset = utf-8" und gehe auch zusammen HTTP Content-Type ist problem , Daten gibt zurück: "Der Server kann die Anfrage nicht bearbeiten, da der Medientyp nicht unterstützt wird". Was passiert also? – AmyNguyen

2

POST-Daten und XML-Daten sind nicht identisch. Sie können XML-Daten genauso senden, wie Sie es getan haben, aber der PHP-Code muss das XML vom Anfragetext analysieren. PHP xml_parse (http://php.net/manual/en/function.xml-parse.php) kann Ihnen dabei helfen.

Alternativ, wenn Sie POST-Daten zu senden würde es vorziehen, das Anforderungs Körper wie folgt aus:

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

8

Ah ja ... prost. Aber die responseData-Ausgabe ist wie "< 48656c6c 6f326f72 6c64>", druckst du NSData nicht mit% @?- per_pilot 15. Januar '10 bei 13:57

, die, weil Sie die „Bytes“ Werte zeigen, sollten Sie es zu NSString passieren die eigentliche Botschaft

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

Standardformat: ... stringWithFormat: @ "usertype =% @ & loginname =% @ & password =% @" ;) – RTOSkit

2

Wenn Sie sehen Verwendung NSURLSession dann in iOS9 gesetzt

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

in PHP

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

In der db (MySql5) set utf-8_generic.