QNetworkReply https API无法在Android设备上运行 - QT

时间:2017-09-18 09:29:42

标签: android c++ qt api qnetworkrequest

我有问题,我用qt制作应用程序,交叉平台,ios&机器人。 所以当我调用这段代码时:

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

  1. QNetworkAccessManager应该用作异步API。 请求完成后发出finished(QNetworkReply *reply)信号。连接到此信号并读取其中的数据。

  2. 如果你真的需要做到&#34;同步&#34;将完成的信号连接到eventLoop的exit()槽。还可以更好地检查之前是否有SSL errors

  3. 某些Android设备需要OpenSSL库。这给我带来了麻烦。需要OpenSSL / libcrypto.so和OpenSSL / libssl.so。即使QSslSocket::supportsSsl()返回true也是如此。