我向具有以下功能的服务器发送JSON请求(应用程序login
,但请求类型无关紧要):
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))
也是string
,这就是为什么它没有像status
这样的字段。最后,解析xhr.responseText
两次会得到一个object
,我实际上可以从中检索我的数据。
如果有人对发生的事情有所了解,我会感兴趣...我不知道这是否相关,但发送JSON的应用服务器是Elixir / Phoenix的最新版本,即,1.5 / 1.3和JSON编码/解码是用毒药完成的。
答案 0 :(得分:1)
这是因为您已将resp变量分配给responseText
resp = JSON.parse(xhr.responseText);
获取响应代码
respCode = xhr.status
或者,如果您想要两者都在同一个resp
变量中,那么
resp = {
responseText: xhr.responseText,
status: xhr.status
}
然后,您可以resp.responseText
和resp.status