AFNetworking публикует массивы JSON в виде нескольких однократных словарей
У меня проблема, аналогичная обсуждаемойВот.
Я пытаюсь опубликовать 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? Наэта страница Мэтт говорит: «Структура, которую вы описываете, не может быть детерминировано представлена в кодировке строки запроса». Я использую POST, поэтому строки запроса не участвуют. Но, может быть, существует ограничение и для данных POST?
Мне также любопытно, почему более длинный вызов AFNetworking, который включает в себяconstructingBodyWithBlock
успех, в то время как более короткий отказывает. Однако этот ответ менее важен для меня. Более длинный метод почти работает, и я был бы рад использовать его, если бы он возвращал тот же JSON, который я отправляю.
Спасибо всем!