0

我正在向具有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编码/解码是用毒药完成的。

4

1 回答 1

1

这是因为您已将 resp 变量分配给 responseText

resp = JSON.parse(xhr.responseText);

获取响应码

respCode = xhr.status

或者,如果您希望两者都在同一个resp变量中,您可以这样做

resp = {
    responseText: xhr.responseText,
    status: xhr.status
}

resp.responseText然后你可以访问它们resp.status

于 2017-09-03T14:47:05.540 回答