Использование NSURLRequest для передачи пар ключ-значение в скрипт PHP с POST - PullRequest
16 голосов
/ 30 марта 2010

Я довольно новичок в Objective-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);

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

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

Есть идеи?

Ответы [ 6 ]

36 голосов
/ 31 марта 2010

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

Код:

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);
4 голосов
/ 22 октября 2010

Это неправильно:

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

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

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
2 голосов
/ 31 марта 2010

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

2 голосов
/ 30 марта 2010

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

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

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

1 голос
/ 18 мая 2012

Это работает на 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);

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

0 голосов
/ 30 марта 2010

Редактировать : исправлено в 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) ."')");
...