天天看點

QT的qnetworkservice,QNetworkAccessManager網絡請求,異步和同步阻塞封裝,加入lambda和信号槽封裝請求響應 【封裝源碼下載下傳】1:示例 【封裝源碼下載下傳】

QT的qnetworkservice,QNetworkAccessManager網絡請求,異步和同步阻塞封裝,加入lambda和信号槽封裝請求和相應。

 【封裝源碼下載下傳】

1:示例

  • (1) 簡單示例
/* 使用lambda特性 */
static HttpService http;
http.get("https://www.qt.io")
    .onResopnse([](QByteArray result){ qDebug()<<"Result: "<<result; })
    .onResopnse([](qint64 recv, qint64 total){ qDebug()<<"Total: "<<total<<"; Received: "<<recv; })
    .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
    .exec();

/* 使用Qt信号與槽特性 */
http.get("https://www.qt.io")
    .onResponse(this, SLOT(finish(QByteArray)))
    .onResponse(this, SLOT(downloadProgress(qint64,qint64)))
    .onError(this, SLOT(error(QString)))
    .exec();
           
  • (2) 複雜示例
/* 擷取音樂url功能,請求嵌套請求 */
static HttpService http;
http.get("http://mobilecdn.kugou.com/api/v3/search/song")
    .queryParam("format", "json")
    .queryParam("keyword", "稻香")
    .queryParam("page", 1)
    .queryParam("pagesize", 3)
    .queryParam("showtype", 1)
    .onResopnse([](QVariantMap result){
        QVariantMap data;
        QList<QVariant> infos;
        if (!result.isEmpty())
            data = result.value("data").toMap();

        if (!data.isEmpty())
            infos = data.value("info").toList();

        static HttpService http;
        foreach (QVariant each, infos) {
            http.get("http://m.kugou.com/app/i/getSongInfo.php")
                .queryParam("cmd", "playInfo")
                .queryParam("hash", each.toMap()["hash"])
                .onResopnse([](QVariantMap result){
                    qDebug()<<"mp3: "<<result["url"].toString();
                 })
                .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
                .exec();
        }
    })
    .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
    .exec();
           
QString strUrl = "http://192.168.0.143:8080/CSMS/hc/api/downloadCallback";

    //拼接json
    QVariantMap map;
    map.insert("keyId",certOperator->getCurDevinfo().strKeyID);
    map.insert("downloadResult",bsuccess?"0":"-1");

    m_service.post(strUrl)
            .header("Content-Type",QVariant("application/json"))
            .jsonBody(QVariant(map))
            .onResopnse([&](QByteArray result)
    {
        qDebug()<<"sealDownloadFeedback::Result: "<<result;
        QJsonDocument doc2 = QJsonDocument::fromJson(result);
        QJsonObject jsonobj = doc2.object();

        QString strResultCode = jsonobj["resultCode"].toString();
        if (strResultCode == "0")//success
        {
            //success todo

        }else
		{
            //failture
        }
    })
    //.onResopnse([](qint64 recv, qint64 total){ qDebug()<<"Total: "<<total<<"; Received: "<<recv; })
    .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
    .timeout(10*1000) // 10s
    .exec();
           

2:如何使用?

  • 以Qt子工程使用.再在其他子工程包含pri檔案即可使用;
  • 通過引用庫的方式使用.

3:如何啟用demo測試?

  • 在QtNetworkService.pro檔案中将"#CONFIG += QT_APP_MODE"這一行的#去除即可轉為可執行檔案形式,在Demo目錄的main.cpp為主執行檔案,如需要測試接口編輯便可。

 【封裝源碼下載下傳】

4:接口的詳細說明

QT的qnetworkservice,QNetworkAccessManager網絡請求,異步和同步阻塞封裝,加入lambda和信号槽封裝請求響應 【封裝源碼下載下傳】1:示例 【封裝源碼下載下傳】