QT 利用Network發送POST請求代碼

見下源碼(xxx爲屏蔽內容):

    QNetworkAccessManager *m_manager = new QNetworkAccessManager(this);

    QString AppEn_Url = "http://xxxx.xxxx.xxxxx.com:80/web/login.do";         //服務器地址
    QNetworkRequest netRequest;
    netRequest.setRawHeader("Host", "xxxx.xxxx.xxxx.com");
    netRequest.setRawHeader("Connection", "keep-alive");
    netRequest.setRawHeader("Cache-Control", "max-age=0");
    netRequest.setRawHeader("Origin", "http://xxxx.xxxx.xxxx.com");
    netRequest.setRawHeader("Upgrade-Insecure-Requests", "1");
    netRequest.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
    netRequest.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36");
    netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
    netRequest.setRawHeader("Referer", "http://xxxx.xxxx.xxxx.com/web/auth/xxxxx.jsp?authtype=xxxxxx");
    netRequest.setRawHeader("Accept-Encoding", "gzip, deflate");
    netRequest.setRawHeader("Accept-Language", "zh-CN,zh;q=0.9");

    QString strJSESSIONID = QUuid::createUuid().toString().replace("{", "").replace("}", "").replace("-", "");
    QByteArray JSESSIONID;
    JSESSIONID.append("Secure; JSESSIONID=");
    JSESSIONID.append(strJSESSIONID);

    netRequest.setRawHeader("Cookie", JSESSIONID);
    netRequest.setUrl(QUrl(AppEn_Url));

    //拼json內容
    QJsonObject obj;
    obj.insert("type", xxx);
    obj.insert("userName", "xxxx");
    obj.insert("idNo", "330226xxxxxxxx3691");
    obj.insert("dataSource", xxx);
    obj.insert("mobile", "136xxxxxxxx");
    QJsonDocument jsonDoc(obj);//QJsonObject轉QJsonDocument
    QString str = QString(jsonDoc.toJson());//QJsonDocument轉QString
    QString j_password = "330226xxxxxxxx3691";

    //post內容
    QString strPostdes = "j_username=" + QString(jsonDoc.toJson() ) + "&j_password=" + j_password;
    qDebug() << strPostdes;

    //發送
    QNetworkReply *reply = m_manager->post(netRequest, strPostdes.toUtf8());
    QByteArray responseData;
    QEventLoop eventLoop;
    QObject::connect(m_manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
    eventLoop.exec();

    //返回結果
    responseData = reply->readAll();
    QString strResponse = QString::fromUtf8(responseData);


    //解析json
    QString res_data = "";
    QString res_date = "";
    QString res_unix = "";
    QString res_microtime = "";
    QString res_appsafecode = "";
    QString res_sgin = "";
    if (strResponse.startsWith("{\"response"))
    {
        QJsonParseError json_error;
        QJsonDocument jsonDocument = QJsonDocument::fromJson(strResponse.toUtf8(), &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
            if (jsonDocument.isObject())
            {
                QJsonObject objDocument = jsonDocument.object();
                QJsonObject objResponse = objDocument["response"].toObject();
                res_data = objResponse.take("data").toString();
                res_date = objResponse.take("date").toString();
                res_unix = objResponse.take("unix").toString();
                res_microtime = objResponse.take("microtime").toString();
                res_appsafecode = objResponse.take("appsafecode").toString();
                res_sgin = objResponse.take("sgin").toString();
            }
        }
    }

//url爲請求網址,content爲請求內容,即傳遞的參數,allcookies應該定義爲全局變量,這裏爲了演示,則定義爲局部變量
void MainWindow::PostLToNet(QString url, QString content)
{
    QByteArray _content = content.toUtf8();
    int _contentLength = content.length();

    QNetworkRequest req;
    req.setUrl(QUrl(url));
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    req.setHeader(QNetworkRequest::ContentLengthHeader, _contentLength);

    QNetworkAccessManager nManager;
    QNetworkReply *getreply = nManager.post(req, _content);
    QEventLoop loop;
    //下載完成後,直接退出子進程
    connect(getreply, SIGNAL(finished()), &loop, SLOT(quit()));
    //子進程開始運行
    loop.exec();

    //讀取所有獲取到的網頁內容
    QTextCodec *codec = QTextCodec::codecForName("utf8");//使用utf8編碼,這樣纔可以顯示中文
    QString data = codec->toUnicode(getreply->readAll()); //獲取網頁的所有數據
    QList<QNetworkCookie> allcookies = nManager.cookieJar()->cookiesForUrl(QUrl(url));    //獲取url的所有cookies
}
//根據獲取的cookies直接獲取murl網址指定的信息
QString MainWindow::GetToAllNet(QString murl)
{
    //轉換cookies成QVariant  把上次得到的cookies 設置到下次訪問的地址
    QVariant var;
    var.setValue(allcookies);

    //設置QNetworkRequest的網址和cookies
    QNetworkRequest req;
    req.setUrl(QUrl(murl));
    req.setHeader(QNetworkRequest::CookieHeader, var);


    //通過QNetworkAccessManager對象獲取網頁內容
    QNetworkAccessManager nManager;
    QNetworkReply *getreply = nManager.get(req);
    //創建一個子進程,以便於提供時間給QNetworkAccessManager對象下載完網頁內容
    QEventLoop loop;
    //下載完成後,直接退出子進程
    connect(getreply, SIGNAL(finished()), &loop, SLOT(quit()));
    //子進程開始運行
    loop.exec();


    //讀取所有獲取到的網頁內容
    QTextCodec *codec = QTextCodec::codecForName("utf8");//使用utf8編碼,這樣纔可以顯示中文
    QString data = codec->toUnicode(getreply->readAll()); //獲取網頁的所有數據
    return data;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章