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 через браузер пользователя по умолчанию, опубликуйте его здесь, чтобы другие могли воспользоваться преимуществами.
Ура.