Dojo请求将[object Object]写入请求

时间:2018-02-05 16:44:35

标签: node.js rest post dojo

我的请求如下:

request.post("/webappbuilder/rest/layerGroups/" + this.appId + "/save", {
                data: {groupInfo: this.groupInfo},
                headers: {
                }
            }).then(function (r) {
                console.log("The server returned: " + r);
                context.setting.destroyLayerSelector();
                context.setting.createGroupableLayerSelector(this.groupInfo);
                context._promptSaved();
            });

当我查看服务器端日志时,我看到该对象被接受为{“groupInfo”:“[object Object]”}。它将[object Object]写入my.groupInfo对象。

如何让服务器接受变量作为json对象?

1 个答案:

答案 0 :(得分:1)

当您将对象提供为data属性时,dojo会假定您要将数据作为常规HTML表单参数发送到服务器。这些参数只是普通键=值对的列表。

所以,如果你想要一个这样的值是一个对象的JSON表示,你必须这样做(注意 JSON.stringify ):

request.post("/webappbuilder/rest/layerGroups/" + this.appId + "/save", {
    data: {groupInfo: JSON.stringify(this.groupInfo)},
    headers: {...}
}).then(...

但是,这实际上意味着groupInfo会像这样发送到服务器:

groupInfo=%7B%22id%22%3A32%2C%22name%22%3A%22Group1%22%7D

在您的服务器上,您可能会看到类似的内容:

 {"groupInfo": "{id:32,name:\"Group1\"}"}

所以你看,价值仍然只是一个字符串!请记住,HTTP参数只是键=值对。这里的关键是groupInfo,值是一个碰巧包含JSON的字符串(但是HTTP不知道,所以你必须自己在应用程序中解析它。)

但是,POST请求不必是无聊的键=值对。请求正文只是文本,所以我们可以在那里放任何东西:XML,JSON,你可以命名它。我们可以通过Content-Type标头告诉服务器格式是什么。如果您的Web应用程序后端框架很聪明,它可能会检查标头并将请求主体解析为一个对象。

request.post("/webappbuilder/rest/layerGroups/" + this.appId + "/save", {
    data: JSON.stringify( {groupInfo: this.groupInfo} ),
    headers: {"Content-Type": "application/json"}
}).then(...

请注意,在这里,我们已经移动了JSON.stringify调用,以便它包含整个数据对象。这意味着data属性实际上是一个字符串,dojo将直接将它用作请求体。我们还提供了Content-Type标头作为Web服务器的线索。

如果您不提供Content-Type标头,即使您的请求正文不包含key = value对,dojo也会发送默认的" application / x-www-form-urlencoded"。 / p>