用QT做一个客户端来调用客户的接口,利用到了https协议。先对post做下记录
- 首先在pro文件中添加
QT += network
- 然后头文件中添加
#include <QNetworkAccessManager> //加载网络请求头文件
#include <QNetworkReply>
#include <QNetworkRequest> //加载发送请求头文件
#include <QEventLoop>
- 代码示例
void LibRSAClient::MessagePost(std::string strCiphertext)
{
QByteArray post_data;
QNetworkRequest network_request;
QString strAnd = "&";
QString strDeviceID, strDetectID, strProduct, strModel, strIMEI, strPicPath, strStartTime, strEndTime, strData;
//设置发送的数据
strDeviceID = "device_id=" + QString::fromStdString(m_sDefect.strDeviceID) + strAnd;
strDetectID = "detect_id=" + QString::fromStdString(m_sDefect.strDetectID) + strAnd;
strProduct = "product=" + QString::fromStdString(m_sDefect.strProduct) + strAnd;
strModel = "model=" + QString::fromStdString(m_sDefect.strModel) + strAnd;
strIMEI = "imei=" + QString::fromStdString(m_sDefect.strimei) + strAnd;
strPicPath = "pic_path=" + QString::fromStdString(m_sDefect.strImagePath) + strAnd;
strStartTime = "start_time=" + QString::fromStdString(m_sDefect.strStartTime) + strAnd;
strEndTime = "end_time=" + QString::fromStdString(m_sDefect.strEndTime) + strAnd;
strData = "data=" + QString::fromStdString(strCiphertext) + strAnd;
post_data.append(strDeviceID);
post_data.append(strDetectID);
post_data.append(strProduct);
post_data.append(strModel);
post_data.append(strIMEI);
post_data.append(strPicPath);
post_data.append(strStartTime);
post_data.append(strEndTime);
post_data.append(strData);
//设置头信息
network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
network_request.setHeader(QNetworkRequest::ContentLengthHeader, post_data.length());
//设置url
network_request.setUrl(m_url);
QEventLoop loop;
QNetworkAccessManager *manage = new QNetworkAccessManager(); //分配空间
//发送请求
while(true)
{
QNetworkReply* pReply = manage->post(network_request, post_data);
connect(pReply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
// 获取发送的返回结果
QNetworkReply::NetworkError err = pReply->error();
if(err == QNetworkReply::NoError)
{
QString strResult = pReply->readAll();
//qDebug() << "Result: " << strResult;
if(strResult.contains("succ"))
{
qDebug() << "post success";
pReply->deleteLater();
pReply = nullptr;
break;
}
else
{
qDebug() << "post fail";
pReply->deleteLater();
pReply = nullptr;
continue;
}
}
}
}
- 上面用到了QEventLoop类,其为我们提供了一种进入和退出一个事件循环的方法。在任何时候,你都可以创建一个QEventLoop实例,然后调用exec()来启动一个事件循环,在这个循环期间,可以调用exit()或者quit()来使exct()返回。 故当pReply返回finish信号时,loop会退出。