Я знаю, как это сделать, это довольно просто.
Проблема в том, что она не работает.
Вот функция, которую я использую для отправки данных:
- (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;}]
ЭТО БЕЗУМИЕ!
Это работает:
@[@{@"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, потому что это не имеет смысла.
РЕДАКТИРОВАТЬ:
Я мог бы:
Создайте два поля MySQL: websiteTitles, websiteURLs.
Сохраните его как одну строку: «Google; http://www.google.com », а затем отделите ее, но это победит цель использования JSON.
Отправить параметры, нарезанные пополам: 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)]; }