Qt QDesktopServices::openUrl - запустить браузер со значениями записей

Я пытаюсь написать простое приложение, которое запустит браузер и отправит его URL на основе ввода пользователя.

QDesktopServices::openUrl(QUrl(url));

Тем не менее, я хотел бы передать переменные вместе с любым URL они отправляют, используя POST, За GETвсе, что мне нужно сделать, это просто вставить значения в URL строка, но как мне добавить POST переменные?.

Благодарю.

2 ответа

Решение

Из официальной документации:

bool QDesktopServices:: openUrl (const QUrl & url) [статические]

Открывает указанный URL в соответствующем веб-браузере для среды рабочего стола пользователя и возвращает true в случае успеха; в противном случае возвращает false.

Если URL является ссылкой на локальный файл (т. Е. Схема URL является "файлом"), то он будет открыт с помощью подходящего приложения вместо веб-браузера.

Короткий ответ: он не был предназначен для управления сетью. Для этого уже можно было бы использовать QNetworkAccessManager, Это был просто удобный способ добавить поддержку для открытия URL, так как в противном случае это потребовало бы совсем немного работы. Не было никаких дальнейших планов, чтобы это скопировать QtNetwork ближе.

Таким образом, я бы предложил использовать что-то вроде этого, чтобы добиться работы с методами post, указав ваш URL:

QUrlQuery urlQuery;
urlQuery.addQueryItem("param1", "value1");
urlQuery.addQueryItem("param2", "value2");
QUrl url = QUrl("http://foo.com");
QNetworkRequest networkRequest(url);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
networkManager->post(networkRequest, urlQuery.toString(QUrl::FullyEncoded).toUtf8());

QDesktopServices не был разработан для этого, я бы предложил сделать ваш HTTP POST, используя QNetworkAccessManager::post вместо.

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

Если у вас нет проблем с поддержкой внешней веб-службы, вы можете настроить службу перенаправления GET-to-POST (поскольку QDesktopService::openUrlможет без проблем передавать строки запроса url в браузеры). При переходе по этому маршруту следует иметь в виду две вещи: а) правильно проверять запросы, получаемые службой, по какому-то белому списку, чтобы избежать проблем с безопасностью, возникающих из-за открытого перенаправления http, и б) учитывать ограничения длины URL-адреса рабочего стола пользователя. браузер и сервер, обрабатывающий перенаправления.

Если игнорировать IE и Edge, настольные веб-браузеры, похоже, способны обрабатывать URL-адреса длиной 32 Кбайта или лучше (цифра, полученная при быстром поиске в Интернете, может быть неточной). Если вы также ориентируетесь на старые телефоны Android, ограничение на длину снижается до 8 КБ.

Другой способ - использовать QWebView который не страдает теми же недостатками, что и QDesktopServices: https://doc.qt.io/archives/qt-5.5/qwebview.html. Единственная проблема в том, что для этого потребуетсяwebkitwidgets модуль, который может или не может быть проблемой для вас.

Боковое примечание: я все еще пытаюсь найти способ решить проблему QDesktopServices. Если вы нашли лучший способ отправить запрос POST через браузер пользователя по умолчанию, опубликуйте его здесь, чтобы другие могли воспользоваться преимуществами.

Ура.

Другие вопросы по тегам