2010-01-15 31 views
20

NSURLConnection ile bir PHP betiğine POST verileri gönderirken bazı sorunlar yaşıyorum. Bu benim kodudur:iPhone, NSURLConnection ile POST gönderme

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

Ve script.php bu kadar basittir:

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

Bu geçmişte benim için çalışmış, ama nedense çıktı şimdi NSLog(@"responseData: %@", responseData); aldığım "theData" yerine "<>" şeklindedir.

Muhtemelen bir yerde yanlış bir yanlışlık var ama onu bulamıyorum gibi görünüyor mu? Herhangi bir fikir?

cevap

39

Verileriniz yanlış. veri PHP $ _POST dizisi bulunabilir bekliyorsan, bu gibi görünmelidir:

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

XML veri göndermek istiyorsanız, farklı bir HTTP Content Type ayarlamanız gerekir. Örneğin. Hiçbir HTTP Content Type,

application/x-www-form-urlencoded 

kullanılacak varsayılan türünü ayarlamak Eğer

application/xml; charset=utf-8 

ayarlayabilirsiniz. Ve bu tür, POST verilerinin bir GET isteğinde sahip olacakları biçime sahip olmasını bekler. Ancak, uygulama/xml gibi farklı bir HTTP İçerik Türü ayarlarsanız, bu veri PHP'deki $ _POST dizisine eklenmez. Ham akışı giriş akışından okumak zorunda kalacaksınız.

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

ve sunucuda aşağıdaki PHP deneyin:

bu deneyin

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

bu komut sadece POST HTTP başlık application/x-www değilse lütfen unutmayın -formu-urlencoded. Eğer uygulama/x-www-form-urlencoded ise, PHP tüm posta verilerini okur, kodunu çözer (anahtar/değer çiftlerine böler) ve son olarak $ _POST dizisine ekler. POST verileri ve XML verileri aynı değil.

+1

Ah evet ... şerefe. Ancak responseData çıktısı "<48656c6c 6f326f72 6c64>" gibidir, %Data ile NSData yazdırmıyor musunuz? –

+0

[request setValue: @ "xxx" forHTTPHeaderField: @ "Content-Type"] için teşekkürler; – Nils

+0

Merhaba, HTTP İçerik Türü ile "text/xml; charset = utf-8" kullanıyorum, istek gönderme tamam ama ben "application/xml; charset = utf-8" kullanıyorum ve aynı zamanda birlikte HTTP İçeriği-türü sorunum var , veri döndürür: "Sunucu, ortam türü desteklenmediği için isteği karşılayamıyor". Peki ne oldu? – AmyNguyen

2

XML verilerini yaptığınız gibi gönderebilirsiniz, ancak PHP kodu XML'in istek gövdesinden ayrıştırılması gerekir. PHP'nin xml_parse (http://php.net/manual/en/function.xml-parse.php) bunu yapmanıza yardımcı olabilir. Eğer POST verilerini gönderirken tercih ediyorsanız

Alternatif böyle istek gövdesini ayarlayın:

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

8

Ah evet ... şerefe. Ancak responseData çıktısı "< 48656c6c 6f326f72 6c64>" gibidir, %Data ile NSData yazdırmıyor musunuz?- Eğer NSString geçmek gerektiğini siz "bayt" değerlerini gösteriyor çünkü 13:57

de Jan 15 '10 per_pilot gerçek mesajı

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

standart biçim: ... stringWithFormat: @ "usertype =% @ & loginname =% @ & password =% @" ;) – RTOSkit

2

Eğer görmek için size Kullanım NSURLSession sonra iOS9 içinde PHP

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

set set

db (MySql5) utf-8_generic öğesini ayarlayın.