通过 Ajax 请求发送后无法解析 JSON
Can't parse JSON after sending it via Ajax request
客户端
将 JSON.stringy
应用到 object 后,它会像这样发送到 node-server(如 POST-request):
{"id":"topFolder","parentPath":null,"name":"newProject","is":"root","children":[]}
我正在通过 Polymer 的 iron-ajax-element 在客户端上发送请求:
<iron-ajax
id="ajaxSave"
method="POST"
url="/save"
handle-as="json"
on-response="doit"
</iron-ajax>
用这个函数发送:
save: function() {
var v = JSON.stringify(this.data);
this.$.ajaxSave.body = v;
this.$.ajaxSave.generateRequest();
}
服务器端
然后我尝试 JSON.parse
Koa-server 上的请求 body(使用 Koa-Body 作为 body 解析器):
router.post('/save', body, function*(){
let data = JSON.parse(this.request.body);
this.body = "all ok";
})
我得到一个 SyntaxError: Unexpected token o
,原始 body 看起来像这样:
{ '{"id":"topFolder","parentPath":null,"name":"new Project","is":"root","children":': [ '' ] }
为什么收到的 body 看起来不一样,我该如何解决?
编辑:这是完整的 curl-command 请求:
curl 'http://localhost:3000/save' -H 'Authorization: Basic YWRtaW46ZXZvbGE=' -H 'Origin: http://localhost:3000' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36' -H 'content-type: application/x-www-form-urlencoded' -H 'accept: application/json' -H 'Referer: http://localhost:3000/' -H 'Cookie: ajs_anonymous_id=%22e43155da-6541-45de-af9f-046ff5ac7b3c%22; currentUserId=34; -H 'Connection: keep-alive' --data '{"id":"topFolder","open":false,"parentPath":null,"name":"new Project","children":[]}' --compressed
您的对象已经是一个对象。
JSON.parse()
用于将包含JSON符号的字符串转换为Javascript对象。
例如,尝试:this.request.body["id"]
获取属性之一。
通常 body 不是字符串,因此请尝试将其显式转换为字符串。
body.toString()
如果没有帮助...
在某些传输库中,您必须在调用 body.read() 之前读取正文。读取操作可以是异步的..
用 q-io 看起来像
request(someURL)
.then( function(res) {
return res.body.read()
})
.then( function (body){
obj = JSON.parse(body.toString()
})
问题是 content-type
设置为 application/x-www-form-urlencoded
。
必须是 application/json
客户端
将 JSON.stringy
应用到 object 后,它会像这样发送到 node-server(如 POST-request):
{"id":"topFolder","parentPath":null,"name":"newProject","is":"root","children":[]}
我正在通过 Polymer 的 iron-ajax-element 在客户端上发送请求:
<iron-ajax
id="ajaxSave"
method="POST"
url="/save"
handle-as="json"
on-response="doit"
</iron-ajax>
用这个函数发送:
save: function() {
var v = JSON.stringify(this.data);
this.$.ajaxSave.body = v;
this.$.ajaxSave.generateRequest();
}
服务器端
然后我尝试 JSON.parse
Koa-server 上的请求 body(使用 Koa-Body 作为 body 解析器):
router.post('/save', body, function*(){
let data = JSON.parse(this.request.body);
this.body = "all ok";
})
我得到一个 SyntaxError: Unexpected token o
,原始 body 看起来像这样:
{ '{"id":"topFolder","parentPath":null,"name":"new Project","is":"root","children":': [ '' ] }
为什么收到的 body 看起来不一样,我该如何解决?
编辑:这是完整的 curl-command 请求:
curl 'http://localhost:3000/save' -H 'Authorization: Basic YWRtaW46ZXZvbGE=' -H 'Origin: http://localhost:3000' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36' -H 'content-type: application/x-www-form-urlencoded' -H 'accept: application/json' -H 'Referer: http://localhost:3000/' -H 'Cookie: ajs_anonymous_id=%22e43155da-6541-45de-af9f-046ff5ac7b3c%22; currentUserId=34; -H 'Connection: keep-alive' --data '{"id":"topFolder","open":false,"parentPath":null,"name":"new Project","children":[]}' --compressed
您的对象已经是一个对象。
JSON.parse()
用于将包含JSON符号的字符串转换为Javascript对象。
例如,尝试:this.request.body["id"]
获取属性之一。
通常 body 不是字符串,因此请尝试将其显式转换为字符串。
body.toString()
如果没有帮助... 在某些传输库中,您必须在调用 body.read() 之前读取正文。读取操作可以是异步的..
用 q-io 看起来像
request(someURL)
.then( function(res) {
return res.body.read()
})
.then( function (body){
obj = JSON.parse(body.toString()
})
问题是 content-type
设置为 application/x-www-form-urlencoded
。
必须是 application/json