如何有效地检查网址是否有效(实际上是向页面加载内容)?

问题描述 投票:1回答:4

问题:

如何检查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的情况下失败。

EDIT2: http://fsd.com实际上现在应该返回404 ...

EDIT3:另一个示例:https://dsd.com加载空白页面(状态代码200),而http://dsd.com实际上加载具有内容的页面(状态代码200)。在我的Node.js后端上,npm包“ url-exists”指示https://dsd.com无效,而我的前端以及问题中显示的代码表明该URL是有效的URL。打包代码如下所示:https://github.com/boblauer/url-exists/blob/master/index.js,但我想知道根据SO用户的最佳方法。

EDIT4:

可悲的是,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");
                    }
                });
javascript jquery ajax url status
4个回答
1
投票

没有内容的成功响应“应该”返回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");
    }
});

1
投票

我认为“ [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

1
投票

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是头请求中可用的元数据之一,它以字节为单位给出主体的大小,因此通过仅检查大小而不加载整个页面,您可以检查响应主体中是否有某些内容。


0
投票

您要完成的工作不是很具体,我不会为您提供有关如何执行此操作的代码示例,但这是一些指针。

您可以通过不同的方式获得响应:状态代码与获得的响应无关,您可能有200条响应,没有数据,或者某些数据有500条错误,这可能是一个html页面显示错误或json对象,或者甚至是指定出了问题的字符串。

[当您说“实际加载页面”时,我想您指的是html响应,您可以在响应标头上检查Content-Type标头,然后查找text/html,还可以检查Content-Length标头检查响应中是否包含内容,即使您检查了这些内容,也很难判断html是否实际显示了任何内容。

这实际上取决于您的具体外观,我的建议是检查Content-Type标头和Content-Length,它还取决于网站的实现,因为每个人可能都有不同的实现HTTP协议的方式。

© www.soinside.com 2019 - 2024. All rights reserved.