У меня есть веб-просмотрщик, и я хочу, чтобы он имел доступ только к нашим веб-приложениям, для этого я разместил заголовок php, который я ищу в своем приложении Qt. Это работает отлично, но с одним исключением, и с 301 постоянными кодами состояния. Современные браузеры перенаправляют вас автоматически, но вводят «/» в конце HTTP-запроса.QNetworkReply и 301 redirect
Когда URL-адрес нашего веб-приложения вводится, в настоящее время требуется, чтобы конечная косая черта позволяла обнаруживать заголовки, но я хочу, чтобы она также попадала в этот заголовок, даже если они не помещают конечную косую черту.
Вот мой текущий метод, чтобы получить заголовок:
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;
}
Чтобы решить проблему удара 301 первых Посылают два сетевых запросов, первый один хитов URL вошел и проверить на 301, если есть код статуса 301, который он получает, предлагаемый URL-код через метод reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
и возвращает этот URL-адрес еще, если код статуса отсутствует, он просто возвращает предыдущий URL-адрес пользователя, а затем отправляет другой сетевой запрос для проверки заголовков.
Первый запрос я посылаю, чтобы проверить код состояния:
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;
}
}
}
Короче говоря, я посылаю две сетевые запросы, 1) Для проверки 301 2) Для проверки нашего заголовка приложения.
Есть ли все-таки сделать это одним запросом? Не хватает ли метода, который будет выполнять это перенаправление автоматически?
С уважением
Натан
Думал, что, возможно, не было способа, но не был уверен, что я что-то упустил, спасибо, что очистил это. @Kfunk :) – Kal
ссылка на официальный HOWTO сломана :( –
@ DavidSánchez: Обновлен комментарий чтобы отразить это. К сожалению, содержание вики не было перенесено до его удаления :( – kfunk