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

Cam*_*ton 1 javascript json google-chrome xmlhttprequest google-chrome-extension

我目前正在撰写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;
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "headers": {
    "Date": "June 20, 2016",
    "Content-Type": "charset=UTF/8",
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

Jua*_*des 6

请参阅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;
}, {});
Run Code Online (Sandbox Code Playgroud)


Seb*_*rth 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)