get代码
#头文件
QNetworkAccessManager *manager;
#cpp文件
manager = new QNetworkAccessManager(this);
//连接信号槽
connect(manager,SIGNAL(finished(QNetworkReply*)),
this,SLOT(Requestfinished(QNetworkReply*)));
QNetworkRequest req;
//获取当地的实时天气网址
req.setUrl(QUrl("https://www.yiketianqi.com/free/day?appid=89533196&appsecret=BWEM61kc&unescape=1"));
manager->get(req);
void MainWindow::Requestfinished(QNetworkReply *reply)
{
if(reply->error() != QNetworkReply::NoError){
qDebug() << reply->error();
return;
}
QByteArray all = reply->readAll();
qDebug() << all;
}
post代码
void sendPostRequest()
{
QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
//设置url
QString url = "http://10.0.0.20:8005/order/charge";
//设置头信息
QNetworkRequest requestInfo;
requestInfo.setUrl(QUrl(url));
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,
QVariant("application/json"));
// requestInfo.setRawHeader("Content-Type","application/json");//服务器要求的数据头部
// requestInfo.setRawHeader("Accept","text/json,*/*;q=0.5");//服务器要求的数据头部
//发送数据
QByteArray qByteHttpData = sendJson();
QNetworkReply *reply = m_pHttpMgr->post(requestInfo, qByteHttpData);
//添加事件循环机制,返回后再运行后面的
QEventLoop eventLoop;
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
//错误处理
if (reply->error() == QNetworkReply::NoError)
{
qDebug() << "request protobufHttp NoError";
}
else
{
qDebug()<<"request protobufHttp handle errors here";
QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
//statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
qDebug(qPrintable(reply->errorString()));
}
//请求收到的结果
QByteArray responseByte = reply->readAll();
}
可以看到,获取get和post的请求回复数据有两种方式。
第一种是绑定在头文件声明了的manager的finished信号,再用曹函数来解析请求回复的数据内容。
第二种是用添加事件循环机制QEventLoop来阻塞,等到finished信号返回后再运行后面的。