Как отправлять 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.

Итак, это просто ошибка в плагине или я что-то здесь упускаю?

Родной плагин HTTP

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

Другие вопросы по тегам