Intereting Posts
генерирование уникальных идентификаторов в php (для сокращения URL) Как проверить, изменилась ли сущность в Doctrine 2? что я могу сделать, чтобы оптимизировать следующую функцию или какую-то другую вещь, чтобы уменьшить потребление памяти? Как очистить кеш веб-сайтов? Сортировка списка файлов по дате Учитывая время, как я могу найти время месяц назад PHP для EasyPHP MySQL сервер 1 секунда задержки соединения Устранение неполадок «Permission denied» при попытке подключения к Redis из скрипта PHP Post / Redirect / Получить на одной странице с firefox Преобразование SVG-изображения в PNG с помощью PHP получение переменных формы с помощью JavaScript как вставить несколько значений флажка в базу данных, используя php Выполните шифрование с помощью PHP (openssl_encrypt), затем расшифруйте с помощью JS (CryptoJS) Я получаю «Ваши требования не могут быть разрешены к устанавливаемому набору пакетов». Когда я запускаю обновление для композитора Переменная Echo PHP из JavaScript?

Как я могу без проблем запускать NSArray из NSDictionaries внутри NSDictionary?

Я знаю, как это сделать, это довольно просто.

Проблема в том, что она не работает.

Вот функция, которую я использую для отправки данных:

- (void)updateWebsitesUsingParameters:(NSDictionary *)parameters; { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:@"http://notreal/updateWebsites.php" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); //... } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //... }]; } 

Вот параметры:

 NSDictionary *parameters = @{@"type" : @"0", @"credentials" : @{@"email" : @"notreal@gmail.com", @"password" : @"notreal"}, @"device" : @{@"ID" : @"8588107756600540", @"numberOfSessions" : @"0", @"name" : @"Nick's iMac"}, @"websites" : @[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]}; 

Вот что сохраняется в поле MySQL:

 [{URL = "http://www.google.com";},{title = Google;},{URL = "http://www.yahoo.com";},{title = Yahoo;}] 

ЭТО БЕЗУМИЕ!

  1. Я успешно сохранил JSON из массива словарей с несколькими атрибутами внутри словаря внутри поля MySQL – или, короче, то, что я пытаюсь сделать здесь, – используя скрипт PHP для другой цели, и это работает, без проблем.
  2. Я использую тот же PHP-код, чтобы сохранить его в поле MySQL, так что это не ошибка PHP.
  3. Все остальные функции сохранения / извлечения, которые я создал с помощью AFNetworking, работают отлично.

Это работает:

 @[@{@"title" : @"Google"}, @{@"title" : @"Yahoo"}] 

Это не означает:

 @[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}] 

Вот ответ:

 { websites = ( { URL = "http://www.google.com"; }, { title = Google; }, { URL = "http://www.yahoo.com"; }, { title = Yahoo; } ); } 

INSANE!

По какой-то причине он разбивается, если я добавляю дополнительный атрибут.

Это должно быть ошибка AFNetworking, потому что это не имеет смысла.

РЕДАКТИРОВАТЬ:

Я мог бы:

  1. Создайте два поля MySQL: websiteTitles, websiteURLs.

  2. Сохраните его как одну строку: «Google; http://www.google.com », а затем отделите ее, но это победит цель использования JSON.

  3. Отправить параметры, нарезанные пополам: websteTitles, websiteURLs

Все отвратительные, любые идеи?

EDIT 2:

Я проведу несколько тестов:

Не имеет значения, имеет ли массив 1 или 2 элемента, которые все еще ведут себя следующим образом.

Я пробовал, что предложил rob180, и, как и ожидалось, это вина AFNetwokring:

 { websites = ( { URL = "http://www.google.com"; }, { title = Google; }, { URL = "http://www.yahoo.com"; }, { title = Yahoo; } ); } 

Это фактическая реакция сервера на то, что было отправлено из приложения, а не mysql посередине.

ИЗМЕНИТЬ 3:

 REQUEST: <NSMutableURLRequest: 0x7f9352d467e0> { URL: http://notreal/updateWebsites.php } 

HTTPBody выглядит так:

 <63726564 656e7469 616c735b ... 653d30> 

Как я могу декодировать это?

Кроме того, я использую AFHTTPRequestSerializer . Возможно, если я изменю его на AFJSONRequestSerializer, он исправит проблему, но я действительно не хочу, так как я написал много методов таким образом.

«параметризация строки запроса просто не является надежным способом кодирования вложенных структур данных. Вот почему все современные веб-фреймворки имеют встроенные удобства, которые автоматически декодируют входящие JSON в параметры».Мэтт Томпсон

Итак, JSON это …

Параметры:

 NSDictionary *parameters = @{@"websites" : @[@{@"Title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"Title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]}; 

Послать:

 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager POST:@"http://server/path/file.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"Error: %@", error.description); }]; 

Получить:

 <?php header('Content-type: application/json'); $request = json_decode(file_get_contents('php://input'), TRUE); $response = ["URLOfTheSecondWebsite" => $request['websites'][1]['URL']]; echo json_encode($response); ?> 

Отклик:

 { URL = "http://yahoo.com"; } 

Все сделано!

Чистое золото.

функция обновления AFQueryStringPairsFromKeyAndValue

изменение

  for (id nestedValue in array) { [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; } 

в

  int i = 0; for (id nestedValue in array) { [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key, i++], nestedValue)]; }