У меня есть аналогичная проблема с обсуждаемой здесь .
Я пытаюсь отправить JSON на сервер.
Вот код Objective-C, который должен работать, но нет. Я получаю пустой массив в объекте ответа, не уверен, почему:
AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }];
Этот код (который адаптирован из кода, который я использую для загрузки изображений). Я знаю, что это определенно не одобренный способ сделать это:
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; AFJSONRequestSerializer * requestSerializer = [AFJSONRequestSerializer serializer]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; manager.requestSerializer = requestSerializer; AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON //passed in constructingBodyWithBlock:^(id <AFMultipartFormData> formData) { //Do nothing } success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }];
Он отправляет мой JSON на сервер, но в процессе формулировки запроса JSON искажается.
Вот как это начинается:
{ "key1": [ { "dictionary1": { "param1": "value1", "param2": "value2", "array1A": [ "value1", "value2" ], "array1B": [ "value1", "value2" ] } } ]
}
и вот что передает AFNetworking на сервер:
{ "key1": [ { "dictionary1": { "array1A": [ "value1" ] } }, { "dictionary1": { "array1A": [ "value2" ] } }, { "dictionary1": { "array1B": [ "value1" ] } }, { "dictionary1": { "array1B": [ "value2" ] } }, { "dictionary1": { "param1": "value1" } }, { "dictionary1": { "param2": "value2" } } ]
}
Вот что показывает Чарльз для запроса. Вы можете увидеть, как структура JSON уже была изменена в запросе, прежде чем сервер коснулся данных.
Вот PHP, который я использую на сервере. Мертвый просто:
<?php header('Content-type: application/json'); //Not sure if this is needed. $json_string = json_encode($_POST); header("HTTP/1.0 200 OK"); echo $json_string; ?>
Итак, все сказанное, вот мои вопросы:
Поддерживает ли AFNetworking вложенные массивы JSON? На этой странице Mattt говорит: «Структура, которую вы описываете, не может быть детерминистически представлена с кодировкой строки запроса». Я использую POST, поэтому строки запроса не задействованы. Но возможно ли ограничение существует и с данными POST?
Мне также любопытно, почему более длинный вызов AFNetworking, который включает в себя constructingBodyWithBlock
преуспевает, а более короткий – не выполняется. Однако этот ответ менее важен для меня. Более длинный метод почти работает, и я был бы рад использовать его, если он вернет тот же JSON, который я отправляю.
Спасибо всем!
Я использую POST, поэтому строки запроса не задействованы. Но возможно ли ограничение существует и с данными POST?
Ограничение не на POST, это кодировка URL-адреса. Я продолжаю говорить, что вы должны кодировать как JSON, что вы можете сделать со следующим изменением конфигурации для своего менеджера:
manager.requestSerializer = [AFJSONRequestSerializer serializer];
,
Кроме того, если вы фактически не создаете многокомпонентный запрос, не используйте constructingBodyWithBlock
версии этого метода.
Я только что рассмотрел ту же проблему, и единственным решением, которое я смог найти, было создание словаря из массива. Должен быть лучший способ, это довольно уродливо …
NSMutableDictionary *arrayDict = [[NSMutableDictionary alloc] init]; int counter = 0; for (NSMutableDictionary *arrayItem in arrayToSend) { [arrayDict setObject:arrayItem forKey:[NSNumber numberWithInt:counter]]; counter++; }
В противном случае все получилось сплющено. Я использую AFJSONRequestSerializer, но это, похоже, не имеет значения.
Уродливые решения для слабых людей: как я могу без проблем запускать NSArray из NSDictionaries внутри NSDictionary?
Ответ на этот пост содержит все, что вам нужно.
У меня тоже была эта проблема в последнее время, у меня были следующие параметры для отправки на сервер, но массив «feature» разбился на 4 части, а не только на два словаря.
{ "description": "Temporary Description", "name": "Product Name", "feature": [ { "fkey": "FT1", "fvalue": "FD1" }, { "fkey": "FT2", "fvalue": "FD2" } ] }
Поэтому я изменил
AFURLRequestSerialisation.m
заменила эту строку в AFQueryStringPairsFromKeyAndValue(NSString *key, id value)
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
с
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%i]", key, [array indexOfObject:nestedValue]], nestedValue)];
И это трюк. Надеюсь, это может помочь кому-то.