如何在 Qt5 中检查 url 是不是可用?

Posted

技术标签:

【中文标题】如何在 Qt5 中检查 url 是不是可用?【英文标题】:How in Qt5 to check if url is available?如何在 Qt5 中检查 url 是否可用? 【发布时间】:2015-02-13 07:31:44 【问题描述】:

使用Qt5,如何简单检查给定的url是否可用?

没有对信号槽使用特殊函数,而只是使用bool isUrlAvailable(QString url)之类的东西,有没有这样的函数?

更新 QUrl.isValid() 是不正确的答案,它只是检查 url 的格式是否正确。

更新 2 QUrl.host() 也是不正确的答案,它只是返回给定 url 的主机部分,它不检查其可用性。

Update 3 ping 主机也不正确,因为 url 可能可用,但不接受 icmp echo (=ping)

【问题讨论】:

在我看来,您的问题过于宽泛,因为检查可用性的方法取决于 URL 中的特定 URI schema。 @Gluttton,如果它总是 http,可能只是对给定 url 的 HEAD 请求?我无法在 Qt5 中找到如何简单地做到这一点。 【参考方案1】:

是的,您可以向给定的 URL 发出 HEAD 请求。

bool urlExists (QString url_string) 
    QUrl url(url_string);
    QTcpSocket socket;
    socket.connectToHost(url.host(), 80);
    if (socket.waitForConnected()) 
        socket.write("HEAD " + url.path().toUtf8() + " HTTP/1.1\r\n"
                     "Host: " + url.host().toUtf8() + "\r\n\r\n");
        if (socket.waitForReadyRead()) 
            QByteArray bytes = socket.readAll();
            if (bytes.contains("200 OK")) 
                return true;
            
        
    
    return false;

这只是200 OK 的一个示例,您可能还想检查状态代码是否在 2XX 或 3XX(重定向)类中。

【讨论】:

谢谢,这很有帮助! :) 如果要访问和加密连接,请使用 QSslSocket。第3、4行需要改成:QSslSocket socket; socket.connectToHostEncrypted(url.host(), 443);【参考方案2】:

所以从睡衣+其他一些SO答案+我找到的教程中获取 (http://www.blikoon.com/networking/http-potocol-writting-a-simple-client-using-qt-qtcpsocket-and-troubleshooting-using-telnet)

我想出了这个经过调整的版本,因为上面的那个不起作用

bool urlExists(QUrl theurl)
    QTextStream out(stdout);
    QTcpSocket socket;
    QByteArray buffer;

    socket.connectToHost(theurl.host(), 80);
    if (socket.waitForConnected()) 
        //Standard http request
        socket.write("GET / HTTP/1.1\r\n"
                 "host: " + theurl.host().toUtf8() + "\r\n\r\n");
        if (socket.waitForReadyRead()) 
            while(socket.bytesAvailable())
                buffer.append(socket.readAll());
                int packetSize=buffer.size();
                while(packetSize>0)
                
                    //Output server response for debugging
                    out << "[" << buffer.data() << "]" <<endl;

                    //set Url if 200, 301, or 302 response given assuming that server will redirect
                    if (buffer.contains("200 OK") ||
                        buffer.contains("302 Found") ||
                        buffer.contains("301 Moved")) 
                        return true;
                    
                    buffer.remove(0,packetSize);
                    //packetSize=getPacketSize(buffer);
                    packetSize=buffer.size();

                 //while packet size >0
             //while socket.bytesavail

         //socket wait for ready read
    //socket write   
return false;

QTextStream 打印从套接字读取的内容,因此您可以知道要添加哪些条件以及为什么您的 http 请求不起作用(我用它来确定我需要 301 和 302)。 while 循环是 ratchetfreak 的答案的修改版本

How to read complete data in QTcpSocket?

确保您从插座中取出所有物品。我正在测试是否需要更改套接字写入的“/index.html”部分,但到目前为止看起来还不错。


编辑:应该只是“GET /”而不是“GET /index.html”

【讨论】:

以上是关于如何在 Qt5 中检查 url 是不是可用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中检查当前的互联网连接是不是可用

如何检查字体是不是在 iOS 版本中可用?

如何检查字典值是不是在 python 的字典列表中可用?

如何检查线性布局中是不是有可用空间

检查url是不是被缓存webview android

如何检查某个功能在特定 iOS 版本上是不是可用?