Как отправлять POST-запросы со свойствами массива (HTTP-плагин Ionic 2)?
В одном из моих проектов Ionic 2 мне нужно отправить запрос POST на сервер с телом JSON, которое выглядит следующим образом:
var body = { "prop" : 1,
"prop2" : "Test",
"prop3": [{ "id" : "1", "qty": 1, "details": "Test" }]
}
Я использую следующий код для вызова сервера с помощью собственного плагина HTTP (1.2.0) в Android:
http.post(url, body, {}).then(function() { ... })
Но мой сервер получает следующее:
{ "prop" : 1,
"prop2" : "Test",
"prop3": "[{ \"id\" : \"1\", \"qty\": 1, \"details\": \"Test\" }]"
}
Как вы можете видеть, свойство массива "prop3" превращается в строку, поэтому мой сервер не может его проанализировать, поскольку ожидает массив, а не строку.
Одна из вещей, которые я мог бы сделать, это изменить код на стороне сервера, чтобы разобрать эту строку обратно в массив (но это было бы далеко от идеала). Другая вещь, которую я мог сделать, - это проанализировать объект JSON вручную с помощью JSON.stringify.
Итак, это просто ошибка в плагине или я что-то здесь упускаю?
2 ответа
Итак, после просмотра исходного кода плагина (Java, я тестирую свое приложение на Android) кажется, что я не смогу использовать плагин как есть (мне нужно его изменить). То, что я нашел, было это:
В CordovaHttpPost.java тело запроса отправляется как данные формы (простые значения ключа).
request.form(this.getParams()); //Map<?, ?>
Вот почему мое свойство массива преобразуется в строку (и любой другой сложный объект в этом отношении)
TL; DR этот плагин полезен только для отправки простых объектов значения ключа JSON (без вложений, без сложных объектов, без массивов и т. Д.).
Попробуй установить http.setDataSerializer("json");
И отправьте данные как обычно: http.post(url, body, {})
Затем плагин http будет отправлять данные с типом контента application/json и поддерживать глубокую структуру json, как указано в документации: https://github.com/silkimen/cordova-plugin-advanced-http