【发布时间】:2016-02-07 18:19:19
【问题描述】:
我正在编写一个向远程服务器发出 HTTP 请求的 javascript 应用程序。用户将输入主机名。
如果他们输入的 DNS 名称无法解析,我想提供诊断消息。这是当前代码:
var req, t, url;
url = 'http://definitelydoesntexist0x314159.com';
req = new XMLHttpRequest();
req.open('GET', url, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
t = req.statusText;
}
};
req.send();
在 onreadystatechange 函数中,req 的 status=0,response 是 "",所以没有太多迹象表明出了什么问题。然而,控制台显示“加载资源失败:net::ERR_NAME_NOT_RESOLVED”,因此浏览器 (Chrome) 能够弄清楚发生了什么。
如何获得 ERR_NAME_NOT_RESOLVED 的指示?
更新:我回到了这个问题,使用的策略是任何不是“超时”的响应都意味着名称已解析、主机回答等。
我最初的问题的答案似乎是:浏览器本身(在本例中为 Chrome)检测到无法解析并将其显示在控制台中,但 XMLHttpRequest API 不够丰富,无法指示原因。因此,可怜的 Javascript 程序员只能将超时作为一种解决方法。
我还删除了 CORS 标头,因为其中一位正确指出的评论者没有任何价值。
【问题讨论】:
-
在请求中设置
req.setRequestHeader('Access-Control-Allow-Origin', url);是没有用的。 -
我听说它很重要:你能说为什么它没有用吗?感谢您帮助我理解这一点
-
因为服务器只能设置。
-
啊哈!是的,现在我明白了。谢谢你。作为记录,以下是 CORS 的工作方式:客户端/浏览器只是发送请求。如果它是另一个来源,客户端/浏览器还包括一个“来源:...”标头。如果 server 想要接受请求,它会以 origin 的“Access-Control-Allow-Origin”标头进行响应。浏览器还会在响应中检查该标头,如果不存在,它会隐藏响应的所有标头信息。
-
您可以查看
req.status == 0 && req.readyState == 4。不幸的是,据我所知,没有办法找出它返回零状态的原因。
标签: javascript dns xmlhttprequest