如何在Qt5中检查网址是否可用?

vla*_*don 2 qt network-programming qt5

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

没有使用信号槽的特殊功能,但只是使用类似的东西bool isUrlAvailable(QString url),有这样的功能吗?

更新 QUrl.isValid()是错误的答案,它只是检查url是否正确形成.

更新2 QUrl.host()也是错误的答案,它只是返回给定网址的主机部分,它不检查其可用性.

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

paj*_*aja 5

是的,您可以对给定的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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想访问和加密连接,请使用QSslSocket。第3、4行需要改为:QSslSocket套接字;socket.connectToHostEncrypted(url.host(), 443); (2认同)