3

在我的一个 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 对象。

那么,这只是插件中的一个错误还是我在这里遗漏了什么?

原生 HTTP 插件

4

2 回答 2

4

尝试设置http.setDataSerializer("json"); 并照常发送数据:http.post(url, body, {})

然后 http 插件将发送具有 application/json 内容类型的数据并支持 json 的深层结构,如文档中所述: https ://github.com/silkimen/cordova-plugin-advanced-http#setdataserializer

于 2018-03-31T15:02:00.923 回答
1

因此,在查看了插件的源代码(Java 源代码,我正在 Android 中测试我的应用程序)之后,我似乎无法按原样使用该插件(我需要对其进行修改)。我发现的是这样的:

在 CordovaHttpPost.java 中,请求的主体作为表单数据(简单的键值)发送。

request.form(this.getParams());  //Map<?, ?>

这就是为什么我的数组属性被转换为字符串(以及任何其他复杂对象)

TL;DR 这个插件仅对发送简单的 JSON 键值对象有用(无嵌套、无复杂对象、无数组等)。

于 2017-03-24T20:52:52.543 回答