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

如何在Qt5中检查url是否可用?,qt,network-programming,qt5,Qt,Network Programming,Qt5,使用Qt5,如何简单地检查给定的url是否可用 不为信号插槽使用特殊函数,而只是简单地使用类似于bool-isurlavable(QString-url)的东西,有这样的函数吗 UpdateQUrl.isValid()是不正确的答案,它只是检查url的格式是否正确 更新2QUrl.host()的回答也不正确,它只返回给定url的主机部分,不检查其可用性 更新3ping主机也不正确,因为url可能可用,但不接受icmp echo(=ping)是的,您可以对给定url执行HEAD请求 bool ur

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

不为信号插槽使用特殊函数,而只是简单地使用类似于
bool-isurlavable(QString-url)
的东西,有这样的函数吗

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

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


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

是的,您可以对给定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(重定向)类中的其他代码。

因此,从pajaja获得一些其他So答案+我找到的教程 ()

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

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;
}
bool URL存在(QUrl theurl){
QTextStream out(标准输出);
QTC插座;
QByteArray缓冲区;
connectToHost(theurl.host(),80);
if(socket.waitForConnected()){
//标准http请求
socket.write(“GET/HTTP/1.1\r\n”
主机:“+theurl.host().toUtf8()+”\r\n\r\n”);
if(socket.waitForReadyRead()){
while(socket.bytesavable()){
append(socket.readAll());
int packetSize=buffer.size();
while(packetSize>0)
{
//用于调试的输出服务器响应

在我看来,您的问题太宽泛了,因为检查可用性的方法取决于特定的URL。@GLUTTON,如果总是http,可能只是将请求发送到给定的URL?我无法在Qt5中找到简单的方法。谢谢,这很有帮助!:)如果要访问和加密连接,请使用QSslSocket。第3行和第4行需要要更改为:qsslssocket;socket.connectToHostEncrypted(url.host(),443);