javascript - 如何有效地检查 url 是否有效(实际上是加载带有内容的页面)?
问题描述
问题:
如何检查 url 是否有效并实际加载页面?
使用我当前的代码,只检查状态代码,这意味着像http://fsd.com/这样的 url将被视为有效,尽管它不加载任何内容。
如何检查 url 是否实际指向可以加载的网站?
代码:
$.ajax({
url: link,
dataType: 'jsonp',
statusCode: {
200: function() {
console.log( "status code 200 returned");
validURL = true;
},
404: function() {
console.log( "status code 404 returned");
validURL = false;
}
},
error:function(){
console.log("Error");
}
});
编辑:通过有效,我的意思是页面最终部分加载(至少加载了 html 和 css),而不是永远加载或以某种方式失败而状态代码为 404。
EDIT2: http: //fsd.com现在实际上返回了 404,因为它应该...
EDIT3:另一个示例:https ://dsd.com加载一个空页面(状态代码 200),而http://dsd.com实际上加载一个包含内容的页面(状态代码 200)。在我的 Node.js 后端,npm 包“url-exists”表示https://dsd.com无效,而带有问题中显示的代码的前端表示它是有效的 url。这是包代码的样子:https ://github.com/boblauer/url-exists/blob/master/index.js但我想知道根据 SO 用户的最佳方式是什么。
编辑4:
可悲的是,Addis 提供的请求显然被 CORS 阻止了,这阻止了我的其余代码的执行,而我的原始请求没有。
$.ajax({
type: "HEAD",
url: link,
dataType: 'jsonp',
}).done(function(message,text,response){
const size = response.getResponseHeader('Content-Length');
const status = response.status;
console.log("SIZE: "+size);
console.log("STATUS: "+status);
if(size > 0 && status == "200") {
$("#submitErrorMessage").css("display","none");
$('#directoryForm').submit();
}
else {
$("#submitErrorMessage").css("display","block");
$("#submitLoading").css("display","none");
}
});
编辑 5:
更准确地说,这两个请求都会在浏览器控制台中触发一条警告消息,指示响应已因 CORS 而被阻止,但我的原始代码实际上是完整执行的,而另一个请求没有到达 console.log( )。
编辑 6:
$.ajax({
async: true,
url: link,
dataType: 'jsonp',
success: function( data, status, jqxhr ){
console.log( "Response data received: ", data );
console.log("Response data length: ", data.length);
console.log("Response status code: ", status);
if (status == "200" && data.length > 0) {
$("#submitErrorMessage").css("display","none");
$('#directoryForm').submit();
}
else {
$("#submitErrorMessage").css("display","block");
$("#submitLoading").css("display","none");
}
},
error:function(jqXHR, textStatus, errorThrown){
console.log("Error: ", errorThrown);
}
});
错误:
Error: Error: jQuery34108117853955031047_1582059896271 was not called
at Function.error (jquery.js:2)
at e.converters.script json (jquery.js:2)
at jquery.js:2
at l (jquery.js:2)
at HTMLScriptElement.i (jquery.js:2)
at HTMLScriptElement.dispatch (jquery.js:2)
at HTMLScriptElement.v.handle (jquery.js:2)
解决方案
该HEAD
请求用于获取meta-information
包含在 HTTP 标头中。好消息是响应不包含正文。它非常快,服务器中不应该有任何繁重的处理来处理它。这使其便于快速状态检查。
HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。 www.w3.org
$.ajax({
type: "HEAD",
async: true,
url: link,
dataType: 'json',
}).done(function(message,text,response){
const size = response.getResponseHeader('Content-Length');
//optionally you may check for the status code to know if the request has been successfully completed
const status = response.status;
});
Content-Length
是头部请求中可用的元数据之一,它以字节为单位给出正文的大小,因此通过仅检查大小而不加载整个页面,您可以检查响应正文中是否有某些内容。-
编辑:上面的
代码是用于dataType
. json
对于dataType
of ,和属性的jsonp
回调函数将接受如下响应:success
error
$.ajax({
url: link,
dataType: 'jsonp',
crossDomain: true,
data: data,
success: function( data, status, jqxhr ){
console.log( "Response data received: ", data );
console.log("Response data length: ", data.length);
console.log("Response status code: ", status);
},
error:function(jqXHR, textStatus, errorThrown){
console.log("Error: ", errorThrown);
}
}
推荐阅读
- java - web.xml 中 cookie 安全标志的动态值
- python - Django Python - 本月和过去 6 个月的查询计数
- python - Python urllib 'ascii' 编解码器无法在位置 5 编码字符 '\u2757':序数不在范围内(128)
- javascript - 如果第二个参数是数字,则 bisectLeft 函数不起作用
- java - Java中如何将字段从接口添加到类?
- python - 在 TensorFlow 中可视化卷积层
- complexity-theory - 创建二叉树的复杂性 VS 二叉搜索树
- arduino - 如何在arduino中停止无效循环?
- linux - Azure CLI aks install cli 权限被拒绝并且 sudo 不起作用
- c++ - 创建一个向量类,在到达结束时将内存大小加倍?