我正在向具有login
以下功能的服务器发送一个 JSON 请求(一个应用程序,但请求的类型并不重要):
function login() {
var payload = {
"api_key" : "", "cmd" : "login",
"params" : {}
}
payload["params"]["username"] = document.getElementById("uname").value
payload["params"]["password"] = document.getElementById("passwd").value
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://localhost:4000/api", true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
resp = JSON.parse(xhr.responseText);
console.log("resp.status=" + resp.status);
console.log("resp.[\"status\"]=" + resp["status"]);
}
}
xhr.send(JSON.stringify(payload));
}
我实际上在responseText
现场得到了正确的答复。例如,如果凭据错误,我会得到
{
"status": "ko",
"errors": [
{
"cmd": "login",
"long": "Login error : 'user-20' has no access to the system",
"short": "login_error"
}
]
}
如果凭据正常,我会得到
{
"status": "ok",
... some additional data
}
但是,我无法获得该status
领域:resp.status
或者resp["status"]
总是undefined
。如果呼叫是在异步模式下完成的(xhr.open("POST", "http://localhost:4000/api", false);
)或者如果我没有JSON.parse()
回复,则相同,即:resp = xhr.responseText;
。
更新 - 2017.09.06
我终于找到了一种让它工作的方法,但我不太明白为什么会这样。我真的变了
resp = JSON.parse(xhr.responseText);
进入
resp = JSON.parse(JSON.parse(xhr.responseText));
为了弄清楚这一点,我打印typeof(xhr.responseText)
了哪个是sting
. 实际上typeof(JSON.parse(xhr.responseText))
也是 a string
,这就是为什么它没有像status
. 最终,解析xhr.responseText
两次给出了一个object
我实际上可以从中检索数据的结果。
如果有人对正在发生的事情有所了解,我会感兴趣......我不知道这是否相关,但发送 JSON 的应用服务器是 Elixir/Phoenix 的最新版本,即 1.5/1.3 JSON编码/解码是用毒药完成的。