Я просмотрел все подобные вопросы, которые я мог найти, но у меня нет ничего подходящего для моей ситуации, что кажется очень простым.
Я тестирую очень простой php-скрипт для захвата этих данных.
Код работает нормально, если я получаю значение в PHP с помощью json_decode (file_get_contents ('php: // input), 1); но совсем не используя $ _POST
По соображениям безопасности, мне сказали, что сервер не может включить 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. Я уверен, что кто-то еще может это проверить. Тем не менее, быстрое и грязное исправление будет заключаться в использовании пар ключ / значение.