Bir web görüntüleyicim var ve sadece webapps'larımıza erişebilmeyi istiyorum, bunu başarmak için Qt Uygulamamda aradığım bir php başlığını yerleştirdim. Bu iyi çalışıyor, ancak bir istisna ile ve 301 kalıcı taşınan durum kodları ile. Modern tarayıcılar sizi otomatik olarak yönlendirir, ancak http isteğinin sonuna bir "/" koymaktadır.QNetworkReply ve 301 yönlendirmesi
Web uygulamamıza bir URL girildiğinde, üstbilgileri algılayabilmeniz için izleyen eğik çizgiye ihtiyaç duyuyor, ancak izleyen bir eğik çizgi koymasa bile bu üstbilgiye ulaşmasını istiyorum. İşte
başlığı almak için benim şimdiki yöntemdir:QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(url);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));
request.setRawHeader("User-Agent", "CytoViewer 1.0");
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer");
QNetworkReply *reply = manager->get(request);
reply->ignoreSslErrors();
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
qDebug() << "QLoop reply all: " << reply->readAll();
qDebug() << "QLoop: " << reply->rawHeader("Cyto-Study-Manager");
if(reply->rawHeader("OurWebApp") == "1"){
//Header exists?(QEventLoop finish) Set arg[1]"url 'Found prouct: product header'"
product = reply->rawHeader("Product");
return true;
} else {
//Header doen't exist? Graceful error - not a valid PI product
return false;
}
İki ağ isteklerini göndermek ilk bir 301 vurma sorununu çözmek için, birincisi URL girildi ve 301 olmadığını kontrol vurur reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
yöntemi ile önerilen URL'yi alması gereken 301 durum kodu vardır ve durum kodu yoksa bu URL'yi döndürür, daha sonra kullanıcının girdiği önceki URL'yi döndürür ve sonra üstbilgileri kontrol etmek için başka bir ağ isteği gönderir. Ben durum kodu kontrol etmek için dışarı göndermek
İlk istek:
QUrl MainWindow::networkRequest(QUrl checkUrl){
qDebug() << "checkURL: " << checkUrl;
//
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(checkUrl);
request.setRawHeader("User-Agent", "CytoViewer 1.0");
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer");
QNetworkReply *reply = manager->get(request);
reply->ignoreSslErrors();
QEventLoop checkLoop;
connect(reply, SIGNAL(finished()), &checkLoop, SLOT(quit()));
checkLoop.exec();
//Check status code
if (reply->error() == QNetworkReply::NoError) {
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(statusCode == 301) {
QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
return redirectUrl;
}else {
return checkUrl;
}
}
}
Uzun lafın kısası, ben iki ağ isteklerini yolluyorum, 1) bizim app başlığında kontrol etmek için 301 2) denetlemek için.
Tek bir istekte bunu yapmak için zaten var mı? Bu yönlendirme işlemini otomatik olarak yapacak bir yöntem eksik mi?
Selamlar
Nathan
Bir yolun bulunmadığını düşündüm ama bir yerde bir şey eksik olup olmadığından emin değildim, bu kadar temizleyeceğiniz için teşekkürler Kfunk :) – Kal
resmi NASIL bozukluğunu bozuyor :( –
@ DavidSánchez: Yorumu güncellendi Bunu yansıtmak için maalesef wiki içeriği silinmeden önce taşınmamış :( – kfunk