QNetworkReply https API не работает на устройствах Android - QT

У меня проблема, я делаю приложение с помощью Qt, Cross Platoform, IOS и Android. Поэтому, когда я называю этот код:

QList<QString> JsonFunctions::getToken(QString Username, QString Password)
{
    QString lista;
    QEventLoop eventLoop;
    QNetworkAccessManager mgr;
    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

    QJsonObject json;

    json.insert("username", Username);
    json.insert("password", Password);
    json.insert("client_id","10");
    json.insert("client_secret","xxx");
    json.insert("scope","xxx");
    json.insert("grant_type","password");
    json.insert("accept", "application/json");

    QNetworkRequest request(QUrl("https://xxxxx/api/v2/login"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QSslConfiguration conf = request.sslConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    request.setSslConfiguration(conf);

    QNetworkReply *reply = mgr.post(request, QJsonDocument(json).toJson());
    eventLoop.exec();

    QString strReply = (QString)reply->readAll();
    qDebug() << "reply" << strReply;
    qDebug() << "code" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    QJsonDocument doc = QJsonDocument::fromJson(strReply.toUtf8());
    QJsonObject responseObject = doc.object();

    QString token_type = responseObject.value("token_type").toString();
    QString access_token = responseObject.value("access_token").toString();
    QString refresh_token = responseObject.value("refresh_token").toString();

    QList<QString> lists;
    lists.append(token_type);
    lists.append(access_token);
    lists.append(refresh_token);

    return lists;
}

Проблема в том, что на Android этот код не работает. Вместо этого на ios все работает. ответ на андроид пуст.

Может быть, потому что https URL создает проблему при вызове Android? Я не понимаю, как это исправить. Я установил на устройстве много разрешений в манифесте, интернет-разрешение установлено.

Теперь много идей для работы? Я тестирую на Asus Zen Pad 3S и Iphone 7. Только на Android не работают. Зачем? Я использую QT 5,9

Заранее спасибо.

1 ответ

  1. QNetworkAccessManager должен использоваться как асинхронный API. По окончании запроса (QNetworkReply *reply) выдается сигнал. Подключитесь к этому сигналу и прочитайте данные в нем.

  2. Если вам действительно нужно сделать его "синхронным", подключите готовый сигнал к выходу () слота EventLoop. Также лучше проверить, не было ли ошибок SSL раньше.

  3. Вам понадобятся библиотеки OpenSSL для некоторых устройств Android. Это доставляло мне неприятности. OpenSSL / libcrypto.so и OpenSSL / libssl.so были необходимы. Даже если QSslSocket::supportSsl() возвращает true.

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