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)
请参阅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)
我使用以下函数将所有响应标头提取为 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)