问题:
如何检查URL是否有效并实际加载页面?
[使用我当前的代码,仅检查状态代码,这意味着尽管http://fsd.com/这样的URL尽管不会加载任何内容,但仍将被视为有效。
如何检查网址是否实际指向可以加载的网站?
CODE:
$.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");
}
});
EDIT:有效是指页面最终被部分加载(至少在html和css中已加载),而不是由于状态代码不为404而永久性地以某种方式失败。
没有内容的成功响应“应该”返回204:无内容,但这并不意味着每个开发人员都正确实施了规范。我想这真的取决于您认为“有效”对您的业务案例意味着什么。
有效值= 200 &&正文中是否包含某些内容?
如果这样,您可以在成功回调中对此进行测试。
$.ajax({
url: link,
dataType: 'jsonp',
success: function (response) {
// todo: test the response for "valid"
// proper length? contains expected content?
},
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");
}
});
我认为“ [valid]在这里使用有误。查看代码片段,我可以看到您正在使用HTTP
错误代码来确定URL
是否有效。但是,根据说明,很明显,仅当资源是网页时,您才认为该资源(由URL指向)是有效的。我想敦促一个事实,即HTTP
可用于访问不需要web page
表示形式的资源。
[我认为您需要更深入地从收到的HTTP
响应中检索该信息(无论是网页表示形式),而仅依靠状态码会误导您。一个明确的指标是看着content-type: text/html
的响应头。
访问www.google.com的示例响应:
date: Tue, 18 Feb 2020 17:51:12 GMT
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=UTF-8
strict-transport-security: max-age=31536000
content-encoding: br
server: gws
content-length: 58083
x-xss-protection: 0
您要完成的工作不是很具体,我不会为您提供有关如何执行此操作的代码示例,但这是一些指针。
您可以通过不同的方式获得响应:状态代码与获得的响应无关,您可能有200条响应,没有数据,或者某些数据有500条错误,这可能是一个html页面显示错误或json对象,或者甚至是指定出了问题的字符串。
[当您说“实际加载页面”时,我想您指的是html响应,您可以在响应标头上检查Content-Type
标头,然后查找text/html
,还可以检查Content-Length
标头检查响应中是否包含内容,即使您检查了这些内容,也很难判断html是否实际显示了任何内容。
这实际上取决于您的具体外观,我的建议是检查Content-Type
标头和Content-Length
,它还取决于网站的实现,因为每个人可能都有不同的实现HTTP协议的方式。
HEAD
请求用于获取HTTP标头中包含的meta-information
。好消息是响应不包含身体。它的速度非常快,服务器中不应进行任何繁重的处理来处理它。这使您可以快速进行状态检查。
HEAD方法与GET相同,除了服务器不得在响应中返回一个消息正文。元信息应包含在HTTP标头中,以响应HEAD请求与响应GET请求而发送的信息相同。这个方法可用于获取有关实体的元信息请求所隐含的内容,而无需转移实体本身。此方法通常用于测试超文本链接的有效性,辅助功能,以及最近的修改。www.w3.org
$.ajax({
type: "HEAD",
async: true,
url: link,
dataType: 'jsonp',
}).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
是头请求中可用的元数据之一,它以字节为单位给出主体的大小,因此通过仅检查大小而不加载整个页面,您可以检查响应主体中是否有某些内容。