Qt5 如何检查 url 是否可用?
How in Qt5 to check if url is available?
使用Qt5,如何简单地检查给定的url是否可用?
没有使用信号槽的特殊函数,只是简单地使用了类似bool isUrlAvailable(QString url)
的函数,有这样的函数吗?
Update QUrl.isValid() 是不正确的答案,它只是检查 url 是否正确形成。
更新 2 QUrl.host() 也是不正确的答案,它只是给定 url 的 returns 主机部分,它不是检查其可用性。
Update 3 ping主机也不正确,因为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(重定向)中的状态代码是否为其他代码 class。
所以从 pajaja + 一些其他的 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是否可用?
没有使用信号槽的特殊函数,只是简单地使用了类似bool isUrlAvailable(QString url)
的函数,有这样的函数吗?
Update QUrl.isValid() 是不正确的答案,它只是检查 url 是否正确形成。
更新 2 QUrl.host() 也是不正确的答案,它只是给定 url 的 returns 主机部分,它不是检查其可用性。
Update 3 ping主机也不正确,因为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(重定向)中的状态代码是否为其他代码 class。
所以从 pajaja + 一些其他的 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"