Dojo请求写入[object Object]请求
Dojo request writes [object Object] to request
我有一个请求如下:
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] 写入我的 this.groupInfo 对象。
我应该怎么做才能使服务器接受变量作为 json 对象?
当您提供 object 作为 data
属性 时,dojo 假定您希望将数据作为常规 HTML 表单参数发送到服务器。这些参数只是普通键=值对的列表。
因此,如果您希望一个这样的值是 object 的 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 参数只是键=值对。在这里,key 是 groupInfo,value 是一个恰好包含 JSON 的字符串(但是 HTTP 不知道,所以你必须在你的应用程序中自己解析它)。
但是,POST 请求不必是无聊的键=值对。请求 body 只是文本,因此我们可以将任何内容放在那里:XML、JSON,随你便。我们可以用 Content-Type header 告诉服务器格式是什么。如果您的 Web 应用程序后端框架很聪明,它可能会检查 header 并为您将请求 body 解析为 object。
request.post("/webappbuilder/rest/layerGroups/" + this.appId + "/save", {
data: JSON.stringify( {groupInfo: this.groupInfo} ),
headers: {"Content-Type": "application/json"}
}).then(...
请注意,在这里,我们移动了 JSON.stringify 调用,以便它包含整个数据 object。这意味着 data
属性 实际上是一个字符串,dojo 会直接将其用作请求 body。我们还提供了 Content-Type header 作为 Web 服务器的线索。
如果您不提供 Content-Type header,dojo 将发送默认的 "application/x-www-form-urlencoded",即使您的请求 body 不包含键=值对。
我有一个请求如下:
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] 写入我的 this.groupInfo 对象。
我应该怎么做才能使服务器接受变量作为 json 对象?
当您提供 object 作为 data
属性 时,dojo 假定您希望将数据作为常规 HTML 表单参数发送到服务器。这些参数只是普通键=值对的列表。
因此,如果您希望一个这样的值是 object 的 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 参数只是键=值对。在这里,key 是 groupInfo,value 是一个恰好包含 JSON 的字符串(但是 HTTP 不知道,所以你必须在你的应用程序中自己解析它)。
但是,POST 请求不必是无聊的键=值对。请求 body 只是文本,因此我们可以将任何内容放在那里:XML、JSON,随你便。我们可以用 Content-Type header 告诉服务器格式是什么。如果您的 Web 应用程序后端框架很聪明,它可能会检查 header 并为您将请求 body 解析为 object。
request.post("/webappbuilder/rest/layerGroups/" + this.appId + "/save", {
data: JSON.stringify( {groupInfo: this.groupInfo} ),
headers: {"Content-Type": "application/json"}
}).then(...
请注意,在这里,我们移动了 JSON.stringify 调用,以便它包含整个数据 object。这意味着 data
属性 实际上是一个字符串,dojo 会直接将其用作请求 body。我们还提供了 Content-Type header 作为 Web 服务器的线索。
如果您不提供 Content-Type header,dojo 将发送默认的 "application/x-www-form-urlencoded",即使您的请求 body 不包含键=值对。