qt通过Httphttps模拟get和Post请求简单点,说话的⽅式简单点.
模拟Get请求
.h中创建两个变量
QString m_strGetURL; //Get请求地址
QNetworkRequest m_netGetRequestHead; //Get请求头
.cpp中
初始化函数中
/* 组装协议头 */
m_netGetRequestHead.setRawHeader("Accept", "application/json, text/plain, */*");
m_netGetRequestHead.setRawHeader("Accept-Language", "zh-CN,en-US;q=0.8");
//...
/
* 如果是https请求,则需⽀持SSL验证 */
if(Lower().startsWith("https"))
{
connect下载QSslConfiguration sslConfig;
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setProtocol(QSsl::TlsV1_0); //具体以OpenSSL版本为准
m_netGetRequestHead.setSslConfiguration(sslConfig);
}
具体逻辑中
/* 1.开始请求数据 */
QNetworkAccessManager netManager;
QNetworkReply *pReply = (m_netGetRequestHead);
/* 2.开启⼀个局部的事件循环,等待响应结束,退出 */
QEventLoop loop;
QTimer timer;
QObject::connect(&netManager,SIGNAL(finished(QNetworkReply *)), &loop,SLOT(quit()));
//请求结束并下载完成后,退出⼦事件循环
QObject::connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
//超时退出
QObject::connect(&timer,SIGNAL(timeout()),&loop, SLOT(quit()));
//超时设置2秒钟
timer.start(m_iTimeOut);
/
/开启⼦事件循环
<();
if(pReply->error() != QNetworkReply::NoError)
{
m_strDebugInfo += "本次未能获取到数据\t";
return ;
}
QVariant statusCodeV = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
int iReplyCode = Int();
/* 3.处理应答报⽂ */
QByteArray arRepData = pReply->readAll();
QString result = QString::StdString()).toUtf8();
QJsonParseError jsonError;
QJsonDocument jsonDocument = QJsonDocument::Utf8(), &jsonError);
== QJsonParseError::NoError)
{
QJsonObject object = jsonDocument.object();
if(1 == object.take("code").toInt())
{
//...
}
}
拿来即⽤的代码.如果要使⽤https请求的话,记得要去下载openssl库,或者直接去下⽅的资源链接下载也⾏(包含能够在android上使⽤的.o 库)
这⾥特别注意⼀点:如果发现应答的数据的应答码是301或者302的话,这是因为重定向
所以决绝办法就是:
重定向的问题看你⽤的是哪个版本的Qt
5.6以前版本:
先⽤reply->rawHeader("Location")获取跳转的url,然后重新请求此url。注意可能会重定向多次,重复执⾏前⾯步骤即可。
5.6之后的版本,包括5.6
在managerNetwork->get之前,调⽤req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);让Qt⾃动为你跳转
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论