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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章