如何使用getAllResponseHeaders方法创建JSON对象

时间:2016-06-20 13:51:01

标签: javascript json google-chrome google-chrome-extension xmlhttprequest

我目前正在撰写Google Chrome扩展程序,我需要了解有关网站的信息。响应标头。为了做到这一点,我使用了getAllResponseHeaders方法,但我需要将它放在一个JSON对象中。不幸的是,我不断收到错误消息SyntaxError: Unexpected token D in JSON at position 0 at main

到目前为止,这是我用来执行此操作的代码:

xmlhttp.open("GET", url, false);
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        allResponseHeaders = xmlhttp.getAllResponseHeaders();
    }
};
xmlhttp.send();

var responseHeaders = JSON.parse(allResponseHeaders);
obj.headers = responseHeaders;

当我在allResponseHeaders = xmlhttp.getAllResponseHeaders();电话后立即发出提醒时,提醒显示通话成功;所有响应标头都已被检索。第一个响应标题是Date,我认为这与我的错误消息的Unexpected token D部分有关,但我不知道为什么它不能正确解析。我该如何解决?提前谢谢。

编辑:我希望我的JSON对象看起来像这样:

{
  "headers": {
    "Date": "June 20, 2016",
    "Content-Type": "charset=UTF/8",
    ...
  }
}

3 个答案:

答案 0 :(得分:5)

https://msdn.microsoft.com/en-us/library/ms536428(v=vs.85).aspx。返回标头是一个crlf分隔的字符串,其中每一行包含由冒号分隔的键值。您可能需要调整下面的代码来计算空格。

var arr = allResponseHeaders.split('\r\n');
var headers = arr.reduce(function (acc, current, i){
      var parts = current.split(': ');
      acc[parts[0]] = parts[1];
      return acc;
}, {});

答案 1 :(得分:0)

您应该将JSON.parse逻辑放在回调onreadystatechange中,因为Ajax是异步调用,并且在发送http请求后立即使用allResponseHeaders时可能无法初始化。

答案 2 :(得分:0)

我使用以下函数使用getAllResponseHeaders()将所有响应标头提取为JS对象:

function getResponseHeaderMap(xhr) {
  const headers = {};
  xhr.getAllResponseHeaders()
      .trim()
      .split(/[\r\n]+/)
      .map(value => value.split(/: /))
      .forEach(keyValue => {
        headers[keyValue[0].trim()] = keyValue[1].trim();
      });
  return headers;
}