在我的一个 Ionic 2 项目中,我需要向具有如下所示的 JSON 正文的服务器发送 POST 请求:
var body = { "prop" : 1,
"prop2" : "Test",
"prop3": [{ "id" : "1", "qty": 1, "details": "Test" }]
}
我使用以下代码使用Android中的本机HTTP插件(1.2.0(调用服务器:
http.post(url, body, {}).then(function() { ... })
但是我的服务器收到以下内容:
{ "prop" : 1,
"prop2" : "Test",
"prop3": "[{ "id" : "1", "qty": 1, "details": "Test" }]"
}
如您所见,数组属性"prop3"正在变成一个字符串,所以我的服务器无法解析它,因为它需要一个数组,而不是一个字符串。
我可以做的一件事是更改服务器端代码以将此字符串解析回数组(但这远非理想(。我可以做的另一件事是使用 JSON.stringify 手动解析 JSON 对象。
那么,这只是插件中的一个错误还是我在这里遗漏了一些东西?
原生 HTTP 插件
尝试设置http.setDataSerializer("json");
并像往常一样发送数据:http.post(url, body, {})
然后 http 插件将发送具有 application/json 内容类型的数据,并支持 json 的深层结构,如文档中所述:https://github.com/silkimen/cordova-plugin-advanced-http#setdataserializer
因此,在查看了插件的源代码(Java 源代码,我正在 Android 中测试我的应用程序(后,似乎我将无法按原样使用该插件(我需要修改它(。我发现的是这样的:
在CordovaHttpPost.java中,请求的正文作为表单数据(简单键值(发送。
request.form(this.getParams()); //Map<?, ?>
这就是为什么我的数组属性被转换为字符串(以及任何其他复杂对象(的原因
TL;DR 这个插件只对发送简单的 JSON 键值对象(没有嵌套、没有复杂对象、没有数组等(有用。