【QT的学习】一个客户端如何向服务器请求

13 篇文章 0 订阅

背景:使用QT开发的一个应用程序要向服务器发送请求数据(例如登录,同步数据),可以有两种方法发送请求:

(1)使用widget类语言,发送http请求:(登录为例)

QNetworkAccessManager ×loginManager;
loginManager = new QNetworkAccessManager(this);
connect(loginManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
    
/*发送地址*/
QNetworkRequest loginReq;
loginReq.setUrl(QUrl("http://XXXXXXXX"));
loginReq.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));

/*构造参数*/
QJsonObject json_object;
json_object.insert("loginname", userNameInput->text());
json_object.insert("password", passWordInput->text());
/*转换成QByteArray*/
QByteArray postData = QJsonDocument(json_object).toJson();
/*post数据*/
    
loginManager->post(loginReq, postData);
return;
void LogInWindow::requestFinished(QNetworkReply* reply)
{
    QString replyMsg;
    /*请求过程中没有问题*/
    if (reply->error() == QNetworkReply::NoError)
    {
        /*转成json格式*/
        QByteArray bytes = reply->readAll();
        QJsonObject replayObj = QJsonDocument::fromJson(bytes).object();
        qDebug()<<"the msg is :"<<bytes.data();

    }
    else
    {
        replyMsg = reply->errorString();
    }

    /*删除replay对象*/
    reply->deleteLater();
    reply = nullptr;
    return;
}

××××××××××××××××××××××××××

上面使用的是post还可以使用get函数:

QNetworkAccessManager ×loginManager;
loginManager = new QNetworkAccessManager(this);
connect(loginManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));

/*构造参数*/
QUrlQuery query;
query.addQueryItem("loginname", userNameInput->text());
query.addQueryItem("password", passWordInput->text());

QUrl mapUrl(“http://XXXXXXXX”);
mapUrl.setQuery(query);

/*发送地址*/
QNetworkRequest loginReq;
loginReq.setUrl(mapUrl);
loginReq.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));

/*get数据*/
    
loginManager->get(mapReq);

(2)使用qml中的js,发送Ajax:

//ajax.js文件
function get(url, success, failure)
{
    var xhr = new XMLHttpRequest;
    xhr.open("GET", url);
    xhr.onreadystatechange = function() {
        handleResponse(xhr, success, failure);
    }
    xhr.send();
}

// POST
function post(url, arg, success, failure)
{
    var xhr = new XMLHttpRequest;
    xhr.open("POST", url);
    xhr.setRequestHeader("Content-Length", arg.length);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");  //用POST的时候一定要有这句
    xhr.onreadystatechange = function() {
        handleResponse(xhr, success, failure);
    }
    xhr.send(arg);
}



// 处理返回值
function handleResponse(xhr, success, failure){
    if (xhr.readyState == XMLHttpRequest.DONE) {
        //console.log("readyState", xhr.readyState, xhr.status)
        if (xhr.status ==  200){
            if (success != null && success != undefined)
            {
                var result = xhr.responseText;
                try{
                    success(result, JSON.parse(result));
                }catch(e){
                    success(result, {});
                }
            }
        }
        else{
            if (failure != null && failure != undefined)
                //console.log("error status",  xhr.responseText, xhr.status)
                failure(xhr.responseText, xhr.status);
        }
    }
}

/*将json对象转成字符串*/
function urlQuery(jsonObject) {
    var query = "";
    var i = 0;
    for(var iter in jsonObject) {

        if(i>0) {
            query += "&";
        }
        if (Array.isArray(jsonObject[iter]))
        {
            query += iter +"=" + "[" +encodeURI(jsonObject[iter]) + "]";
        }
        else
        {
            query += iter +"=" + encodeURI(jsonObject[iter]);
        }

        //console.log("item1", iter,query)
        i++;
    }
    //console.log("url query:", query);
    return query;
}
var par = {
"point": 117,
 "yaw": 90}
//调用ajax中函数
Ajax.post("http://XXXXXX", Ajax.urlQuery(truckPar),
function(result, json){
console.log("receive the json:",result, json[0], json[1], json[2])
},
function (responseText, status){
console.log("can not receive the json:",status, responseText)
}
)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值