如何发送 POST 具有数组属性的请求(Ionic 2 HTTP 插件)?
How to send POST requests with array properties (Ionic 2 HTTP plugin)?
在我的一个 Ionic 2 项目中,我需要向服务器发送一个 POST 请求,其主体 JSON 如下所示:
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 对象
所以,这只是插件中的错误还是我在这里遗漏了什么?
因此,在查看了插件的源代码(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#setdataserializer
在我的一个 Ionic 2 项目中,我需要向服务器发送一个 POST 请求,其主体 JSON 如下所示:
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 对象所以,这只是插件中的错误还是我在这里遗漏了什么?
因此,在查看了插件的源代码(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#setdataserializer