iPhone отправляет POST с NSURLConnection - PullRequest
21 голосов
/ 15 января 2010

У меня проблемы с отправкой POST-данных в PHP-скрипт с 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);

И мой script.php так прост:

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

Это работало для меня в прошлом, но по какой-то причине вывод, который я получаю из NSLog(@"responseData: %@", responseData);, теперь просто "<>" вместо "theData".

Возможно, какая-то глупая ошибка где-то, но я не могу ее найти? Есть идеи?

Ответы [ 5 ]

39 голосов
/ 15 января 2010

Ваши данные неверны. Если вы ожидаете, что данные будут найдены в массиве $ _POST PHP, они должны выглядеть следующим образом:

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

Если вы хотите отправить данные XML, вам нужно установить другой тип содержимого HTTP. Например. вы можете установить

application/xml; charset=utf-8

Если вы не указали тип содержимого HTTP, тип по умолчанию

application/x-www-form-urlencoded

будет использоваться. И этот тип ожидает, что данные POST будут иметь тот же формат, что и в запросе GET.

Однако, если вы установите другой тип содержимого HTTP, например application / xml, эти данные не будут добавлены в массив $ _POST в PHP. Вам придется читать необработанные данные из входного потока.

Попробуйте это:

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

и на сервере попробуйте следующий PHP:

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

Обратите внимание, что это работает, только если заголовок HTTP вашего POST не является application / x-www-form-urlencoded. Если это application / x-www-form-urlencoded, то PHP сам считывает все данные поста, декодирует их (разбивает на пары ключ / значение) и, наконец, добавляет их в массив $ _POST.

8 голосов
/ 16 ноября 2011

Ах да ... ура. Но вывод responseData похож на «<48656c6c 6f326f72 6c64>», разве вы не печатаете NSData с% @? - per_pilot 15 января 2010 года в 13: 57

потому что вы показываете "байтовые" значения, вы должны передать его NSString, чтобы увидеть реальное сообщение

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
7 голосов
/ 13 декабря 2012
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];
2 голосов
/ 22 января 2016

Если вы используете NSURLSession, то в iOS9 установите

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

В PHP установлен

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

В БД (MySql5) установите utf-8_generic.

2 голосов
/ 15 января 2010

Данные POST и данные XML не совпадают. Вы можете отправлять данные XML точно так же, как вы это делали, но код PHP должен анализировать XML из тела запроса. PHP xml_parse (http://php.net/manual/en/function.xml-parse.php) может помочь вам сделать это.

В качестве альтернативы, если вы предпочитаете отправлять POST-данные, установите тело запроса следующим образом:

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

...