Использование NSURLRequest для передачи пар ключ-значение в PHP-скрипт с помощью POST

Я довольно новичок в объекте-c, и я хочу передать несколько пар ключ-значение в PHP-скрипт, используя POST. Я использую следующий код, но данные просто не отображаются. Я попытался отправить материал, используя NSData, но, похоже, не работает.

NSDictionary* data = [NSDictionary dictionaryWithObjectsAndKeys: @"bob", @"sender", @"aaron", @"rcpt", @"hi there", @"message", nil]; NSURL *url = [NSURL URLWithString:@"http://myserver.com/script.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; NSURLResponse *response; NSError *err; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; NSLog(@"responseData: %@", content); 

Это отправляется на этот простой скрипт для выполнения вставки db:

 <?php $sender = $_POST['sender']; $rcpt = $_POST['rcpt']; $message = $_POST['message']; //script variables include ("vars.php"); $con = mysql_connect($host, $user, $pass); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("mydb", $con); mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) VALUES ($sender, $rcpt, $message)"); echo "complete" ?> 

Есть идеи?

Solutions Collecting From Web of "Использование NSURLRequest для передачи пар ключ-значение в PHP-скрипт с помощью POST"

Спасибо за предложения всем. В итоге мне удалось решить проблему, используя данные, приведенные здесь .

Код:

 NSString *myRequestString = @"sender=my%20sender&rcpt=my%20rcpt&message=hello"; NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ]; NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString: @"http://people.bath.ac.uk/trs22/insert.php" ] ]; [ request setHTTPMethod: @"POST" ]; [ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; [ request setHTTPBody: myRequestData ]; NSURLResponse *response; NSError *err; NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; NSLog(@"responseData: %@", content); 

Это не верно:

 [NSData dataWithBytes:[post UTF8String] length:[post length]] 

Длина должна быть выражена в байтах не в количестве символов UTF8. Вместо этой строки вы должны использовать:

 NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 

Эта строка [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; выглядит неправильно для меня.

Я думаю, что вы хотите: [request setAllHTTPHeaderFields:data];

Во-вторых, вы обнаружите, что каркас Cocoa капитализирует первую букву ваших имен полей перед их отправкой (досадно). Возможно, вам придется внести некоторые изменения, чтобы справиться с этим.

Если вы собираетесь делать много сообщений о формах, я бы рекомендовал пропустить NSURLRequest и вместо этого использовать ASIHTTPRequest . IMHO, он хорошо документирован и предлагает простой способ взаимодействия с веб-сервисами.

Это работает на IOS 5.o для отправки формы и получения данных:

 self.requestFor = serviceNameT; responseData = [[NSMutableData data] retain]; SharedResponsedObject* sharedResponsedObject = [SharedResponsedObject returnSharedInstance]; LoginInfo* loginInfo = (LoginInfo*)sharedResponsedObject.loginInfo; NSLog(@"DEVICE_TOKEN: %@, loginInfo.sessionId: %@, itemIdT: %@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT); NSString* requestStr = [NSString stringWithFormat:@"Token=%@&SessionId=%@&ItemId=%@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT]; NSData *myRequestData = [ NSData dataWithBytes: [ requestStr UTF8String ] length: [ requestStr length ] ]; NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://menca.com:1500/DownloadContent.aspx"]]; [request setHTTPMethod: @"POST" ]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; [ request setHTTPBody: myRequestData ]; NSURLResponse *response; NSError *err; NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; NSLog(@"ServerRequestResponse::responseData: %@", content); 

Спасибо и с уважением, Арун Дхвай

Изменить : Исправлено в OP.


Это не может быть вашей единственной проблемой (я не знаю, как это происходит вокруг цели-c), но здесь говорится:

 mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) VALUES ($sender, $rcpt, $message)"); 

Вы не цитируете ваши строки – MySQL обязательно должен иметь под собой подгонку.

 mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) VALUES ('$sender', '$rcpt', '$message')"); 

Помимо этого, как правило, даже если ваш сценарий недоступен извне, вы не должны доверять пользовательскому вводу и использовать mysql_real_escape_string() чтобы избежать своих значений, прежде чем вставлять их в инструкцию SQL, чтобы предотвратить SQL-инъекцию или использовать подготовленные операторы (предпочтительнее) – в противном случае одинарные кавычки в ваших законных данных нарушат синтаксис инструкции SQL.

Весьма безосновательный пример для справки:

 mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) VALUES ('" . mysql_real_escape_string($sender) ."'," ." '" . mysql_real_escape_string($rcpt) ."'," ." '" . mysql_real_escape_string($message) ."')");