2017-09-18 38 views
0

問題があります。QT、クロスプラットフォーム、iOS &アンドロイドでアプリを作っています。私はこのコードを呼び出すとき だから:QNetworkReply https APIがAndroid搭載端末で動作しない - QT

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がアンドロイドコールで問題を作成している可能性がありますか?私はそれを修正する方法を理解していません。 私は、マニフェストで多くのアクセス許可をデバイスに設定しました。インターネット許可が設定されています。

今、多くのアイデアは動作しますか?私はasus zen pad 3sとiphone 7でテストしています。アンドロイドでのみ動作しません。どうして ?私はqtを使用する5.9

ありがとうございます。

答えて

1
  1. QNetworkAccessManagerを非同期APIとして使用する必要があります。 要求が完了すると、finished(QNetworkReply *reply)シグナルが発行されます。この信号に接続し、その信号を読み取る。

  2. 本当に "同期"にする必要がある場合は、完了信号をexit() eventLoopのスロットに接続します。前にSSL errorsがあったかどうかをよく確認する。

  3. 一部のAndroidデバイスではOpenSSLライブラリが必要です。これは私の悩みを引き起こしていました。 OpenSSL/libcrypto.soとOpenSSL/libssl.soが必要でした。 QSslSocket::supportsSsl()がtrueを返しても。