从XMLHttpRequest中检索响应有效内容元素

时间:2017-09-03 14:30:51

标签: javascript json xmlhttprequest elixir-framework elixir-poison

我向具有以下功能的服务器发送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.statusresp["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编码/解码是用毒药完成的。

1 个答案:

答案 0 :(得分:1)

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

resp = JSON.parse(xhr.responseText);

获取响应代码

respCode = xhr.status

或者,如果您想要两者都在同一个resp变量中,那么

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

然后,您可以resp.responseTextresp.status

访问它们