IPhone отправляет POST с NSURLConnection
У меня возникли проблемы с отправкой данных POST на PHP script с 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".
Возможно, какая-то хромая ошибка где-то, но я не могу ее найти? Любые идеи?
Ответы
Ответ 1
Ваши данные неверны. Если вы ожидаете, что данные будут найдены в массиве $_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. Вам нужно будет прочитать raw из входного потока.
Попробуйте следующее:
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 не является приложением /x -www-form-urlencoded. Если это application/x-www-form-urlencoded, то сам PHP читает все данные сообщения, декодирует его (разбивая его на пары ключ/значение) и, наконец, добавляет его в массив $_POST.
Ответ 2
Ах да... ура. Но вывод responseData похож на "< 48656c6c 6f326f72 6c64 > ", вы не печатаете NSData с помощью% @? - per_pilot Янв 15 '10 в 13:57
потому что вы показываете значения "байтов", вы должны передать их NSString, чтобы увидеть реальное сообщение
NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
Ответ 3
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];
Ответ 4
Данные 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];
Ответ 5
Если вы используете 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'");
В db (MySql5) установите utf-8_generic.