Я боролся с этим в течение последних нескольких дней; Я пытаюсь отправить массив на PHP. Я могу успешно отправить его, но он не принят с пост-переменной (я пытаюсь использовать ключ переменной «json» … С помощью этого кода я получаю массив в php:
Objective-C
NSError *error; NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: @"one", @"two", @"three", nil] forKeys: [NSArray arrayWithObjects: @"a", @"b", @"c", nil]]; NSArray *jsonArray = [NSArray arrayWithObject:jsonDictionary]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonArray options:NSUTF8StringEncoding error:&error]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"somewebservicelocation/arrayTest.php?json="]]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *response = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"response: %@",response);
PHP
$handle = fopen('php://input','r'); $array = fgets($handle); echo $array; if(isset($array)) { echo "success"; } else { echo "failure"; }
Если я использую этот PHP, используя _POST, я не получаю любви:
$rawJsonData = $_POST['json']; $array = json_decode(stripslashes($rawJsonData),true); echo $array; if(isset($array)) { echo "success"; } else { echo "failure"; }
… Я был в нем несколько дней – по всему стеку переполнения, и понимаю, что мне нужно включить переменную и данные в тело запроса, но я просто не могу заставить его работать. Что я делаю не так? Как вы это делаете по-другому? Спаси меня от этой головной боли …
На стороне PHP я использовал что-то похожее на ваш первый пример:
<?php $handle = fopen("php://input", "rb"); $http_raw_post_data = ''; while (!feof($handle)) { $http_raw_post_data .= fread($handle, 8192); } fclose($handle); // do what you want with it // // For diagnostic purposes, I'm just going to decode, make sure I got an array, // and respond with JSON that includes status, code, and the original request $post_data = json_decode($http_raw_post_data,true); if (is_array($post_data)) $response = array("status" => "ok", "code" => 0, "original request" => $post_data); else $response = array("status" => "error", "code" => -1, "original_request" => $post_data); $processed = json_encode($response); echo $processed; ?>
И затем на стороне iOS я использую:
// create the dictionary (or array) NSDictionary *dictionary = @{@"a": @"One", @"b": @"Two", @"c": @"Three"}; NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; if (error) NSLog(@"%s: JSON encode error: %@", __FUNCTION__, error); // create the request NSURL *url = [NSURL URLWithString:@"your.url.here"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:data]; // issue the request NSURLResponse *response = nil; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error) NSLog(@"%s: NSURLConnection error: %@", __FUNCTION__, error); // examine the response NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"responseString: %@",responseString);
Я только что проверил эту поездку туда и обратно, и все отлично.
Если вы настроены использовать метод _POST
, то для меня работает, чтобы установить данные json=%@
, например:
NSDictionary *dictionary = ... NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (error) NSLog(@"%s: JSON encode error: %@", __FUNCTION__, error); NSURL *url = [NSURL URLWithString:@"your.url.here"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; NSString *params = [NSString stringWithFormat:@"json=%@", [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSData *paramsData = [params dataUsingEncoding:NSUTF8StringEncoding]; [request addValue:@"8bit" forHTTPHeaderField:@"Content-Transfer-Encoding"]; [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:paramsData]; // now send the request, like before
И PHP для его анализа очень похож на вас:
$http_raw_post_data = $_POST['json']; $post_data = json_decode(stripslashes($http_raw_post_data),true); if (is_array($post_data)) $response = array("status" => "ok", "code" => 0, "original request" => $post_data); else $response = array("status" => "error", "code" => -1, "original_request" => $post_data); $processed = json_encode($response); echo $processed;
Было бы лучше использовать ниже ответ PHP-функции в stdobject
parse_str(file_get_contents("php://input"), $data); $d = json_decode(json_encode($data));