背景:使用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)
}
)