iOS 5- отправка json с использованием NSURLRequest и разбор в php через $ _POST

Я просмотрел все подобные вопросы, которые я мог найти, но у меня нет ничего подходящего для моей ситуации, что кажется очень простым.

  1. Я создаю простой NSURLRequest, используя POST и устанавливая его тело в сборку NSDATA, используя класс NSJSONSerialization.
  2. Я тестирую очень простой php-скрипт для захвата этих данных.

  3. Код работает нормально, если я получаю значение в PHP с помощью json_decode (file_get_contents ('php: // input), 1); но совсем не используя $ _POST

  4. По соображениям безопасности, мне сказали, что сервер не может включить file_get_contents () … поэтому я ищу альтернативу.

Вот мой код Obj-C для создания запроса:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.techno-mac.org/dev101/jsonForm.php"]]; [request setHTTPMethod:@"POST"]; NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init]; [jsonDict setValue:self.userNameField.text forKey:@"userName"]; NSLog(@"Dict: %@",jsonDict); NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"JSON String: %@",jsonString); //[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"json" forHTTPHeaderField:@"Data-Type"]; [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody: jsonData]; NSLog(@"jsonData: %@",jsonData); self.postConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:true]; 

Вот консольный журнал, когда я запустил его, набрав «test» в поле, которое закодировано в json-данных:

 2012-05-17 20:26:19.417 RBWebServices[95037:f803] Dict: { userName = test; } 2012-05-17 20:26:19.418 RBWebServices[95037:f803] JSON String: {"userName":"test"} 2012-05-17 20:26:19.418 RBWebServices[95037:f803] jsonData: <7b227573 65724e61 6d65223a 22746573 74227d> 2012-05-17 20:26:19.464 RBWebServices[95037:f803] Received response from server, resetting data length to zero 2012-05-17 20:26:19.465 RBWebServices[95037:f803] Succeeded! Received 12 bytes of data 

И вот мой очень простой скрипт php, который работает:

 $json_post = json_decode(file_get_contents('php://input'),1); $myArray = $json_post["userName"]; print $myArray; 

и код, который не выполняет (возвращает «массив»)

 $json_post = json_decode($_POST); print $json_post["userName"]; 

Если я введу это в php:

 var_dump($_POST) 

Я получаю:

 array(0){} 

Поскольку работает первый сценарий, я склонен думать, что это пустой $ _POST, который является причиной … или способ, которым я пытаюсь что-то извлечь из этого, но он кажется совершенно пустым.

Если это невозможно с помощью $ _POST, возможно, есть другой способ не использовать file_get_contents?

Я далек от того, чтобы быть экспертом по php вообще … извините, если это кажется тривиальным.

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

Быстрый тест с использованием следующего скрипта и curl показал, что $_POST был заполнен только при использовании пар ключ / значение. В противном случае он считался исходным.

Автор сценария:

 var_dump($_POST); var_dump(file_get_contents('php://input')); 

Выполненные (исходные данные):

 curl -X POST -d "whatever" http://jason.local/dev/server.php 

Выход (пустой $_POST ):

 array(0) { } string(8) "whatever" 

Выполнено (пара ключ / значение):

 curl -X POST -d "data=whatever" http://jason.local/dev/server.php 

Вывод:

 array(1) { ["data"]=> string(8) "whatever" } string(13) "data=whatever" 

Это действительно может быть частью спецификаций HTTP Spec или PHP. Я уверен, что кто-то еще может это проверить. Тем не менее, быстрое и грязное исправление будет заключаться в использовании пар ключ / значение.