【问题标题】:QNetworkReply https API doesn't work on Android devices - QTQNetworkReply https API 在 Android 设备上不起作用 - QT
【发布时间】:2017-09-18 09:29:42
【问题描述】:

我有一个问题,我正在使用 qt、跨平台、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 上一切正常。 android上的回复是空的。

也许是因为 https url 在 android 调用上产生了问题?我不明白如何解决它。 我在清单中设置了设备上的许多权限,设置了互联网权限。

现在,有很多想法可行吗?我正在华硕 zen pad 3s 和 iphone 7 上进行测试。仅在 android 上不起作用。为什么 ?我使用 qt 5.9

提前致谢。

【问题讨论】:

    标签: android c++ qt api qnetworkrequest


    【解决方案1】:
    1. QNetworkAccessManager 应该用作异步 API。 当请求完成时,会发出finished(QNetworkReply *reply) 信号。连接到此信号并读取其中的数据。

    2. 如果您确实需要使其“同步”,请将完成信号连接到 eventLoop 的 exit() 插槽。还最好检查之前是否有任何SSL errors

    3. 对于某些 Android 设备,您将需要 OpenSSL 库。这给我带来了麻烦。需要 OpenSSL/libcrypto.so 和 OpenSSL/libssl.so。即使QSslSocket::supportsSsl() 返回真。

    【讨论】:

    • Qt https 请求在 iOS 和旧版 Android(例如 Android 4.4 Kit Kat)上运行良好。一个较新的 Android 版本 QSslSocket::supportsSsl() 可能会返回 true,但是没有 libcrypto.so 可供您的 Qt 应用程序链接。在调试器中,我可以看到“qt.network.ssl:QSslSocket:无法调用未解析的函数 SSL_CTX_ctrl”。使用 clang 在 Mac 上构建 OpenSSL 是一项挑战。见:doc.qt.io/qt-5/opensslsupport.html
    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 2020-03-13
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多