我目前正在撰写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",
...
}
}
答案 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;
}