QtWebEngine: загрузка URL-адреса с помощью HTTPPost

Я переношу внутренний браузер с QtWebKit на QtWebEngine.

Я хочу, чтобы функция запрашивала URL-адрес при публикации некоторых данных. С WebKit я мог бы использовать следующее:

С классом WebView, производным от QtWebView:

void WebView::loadPostUrl(const QUrl &url, QByteArray postdata)
{
    m_initialUrl = url;
    QNetworkRequest request = QNetworkRequest(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    load(request, QNetworkAccessManager::PostOperation, postdata);
}

Поскольку QtWebEngine взаимодействует с QNetworkAccessManager, как мы можем иметь те же функции с QtWebEngine?

Спасибо


person ruddy    schedule 30.01.2016    source источник
comment
Вы можете загрузить веб-страницу, которая, в свою очередь, выполняет запрос POST.   -  person MrEricSir    schedule 30.01.2016
comment
В моем приложении QT есть значения параметров для публикации на этом URL-адресе. Итак, вы хотите, чтобы я вызывал другой URL-адрес с этими параметрами в GET, который затем вызывал основной URL-адрес с помощью POST?   -  person ruddy    schedule 31.01.2016
comment
Это один метод. Другим было бы отправить данные на страницу через WebSockets.   -  person MrEricSir    schedule 31.01.2016
comment
Все эти методы требуют доступа и изменений на стороне сервера, чего я не хочу делать.   -  person ruddy    schedule 31.01.2016
comment
Есть новости о POSTing с использованием QWebEngine? У меня такая же проблема с переносом вызова QWebView::load() в QWebEngine...   -  person Heiko Nardmann    schedule 11.05.2016
comment
У меня такая же проблема. load() принимает только 1 аргумент. Это кажется огромным упущением, если мы не можем POST   -  person Abei Villafane    schedule 17.05.2016


Ответы (1)


Мое решение заключалось в использовании QWebEnginePage::runJavaScript() для сценария входа в систему. имитации почтовой операции.

QString strLoginScript(
    "var formElts = document.getElementById('formSignIn').elements;"
    "formElts['inputLoginName'].value = '%1';"
    "formElts['inputPassword'].value = '%2';"
    "formElts['btnSignIn'].click();")
    .arg(strUsername)
    .arg(strPassword);

// execute JavaScript code on current page
webEngineView->page()->runJavaScript(strLoginScript);

Необязательный последний параметр (здесь не показан) — это лямбда-функция, которая выполняется, когда ваша функция JavaScript завершает работу и получает последнее выходное значение.

В документации нет ясности по этому вопросу, но я думаю, что функция выполняется асинхронно из основного потока - в противном случае вы просто заблокировали бы выполнение и ждали, вместо того, чтобы передавать необязательный лямбда/функтор/указатель на функцию для выполнения позже.

person Glen van de Mosselaer    schedule 30.09.2016