您的位置 首页 php

QT学习:用http的post方式访问URL并获取内容

界面基本差不多了,现在我们来做实质功能。

首先,我们要将视频网址发到我们的解析程序上,我用PHP做了一个解析程序,放到了网上。所以我要让QT用post的方式将我们要解析的网址发送过去,然后网上的解析程序把解析完的下载网址再用json格式反回来给我们的QT程序,这样我们就能下载了。

这就是本节要搞的重点,经过搜索,QT中访问http网址要用这两个类:

 QNetworkAccessManager
QNetworkRequest  

第一个QNetworkAccessManager类,是网络的载体类,它负责网络的请求和通信管理。而QNetworkRequest是一个负责给QNetworkAccessManager发送起始请求的角色,它发起请求后QNetworkAccessManager就会开始进行处理并创建事件。

所以我们要做的流程基本是:

0、定义一个全局的QNetworkAccessManager,然后设置信号槽响应它的事件。

1、用 QByteArray存储要post的参数。

2、用QNetworkRequest创建网络访问的请求

3、在QNetworkAccessManager槽事件处理返回的数据

有个疑问:访问网络是自动创建一个新线程,还是阻塞当前线程?

不管了,先做做看。

首先在mainwindow.h里定义私有变量

 QNetworkAccessManager *nam;  

然后定义槽函数

 private slots:
void finishedSlot(QNetworkReply *reply);  

别忘了要先

 #include <QtNetwork/QNetworkAccessManager>  

然后在mainwindow的构造函数里创建它的实例并绑定槽函数:

     nam = new QNetworkAccessManager(this);  
    QObject::connect(nam, SIGNAL(finished(QNetworkReply*)),  
             this, SLOT(finishedSlot(QNetworkReply*)));  

记得一定要设置那个this,要不然就得手动delete它了。

然后实现槽响应函数:

 void MainWindow::finishedSlot(QNetworkReply *reply){
    // 网络访问的槽响应函数
    // HTTP状态码
    QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    // 重定向了没有,如果有,这里就是重定向的网址
    QVariant redirectionTargetUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
    
    // 如果没有错误发生
    if (reply->error() == QNetworkReply::NoError)
    {
        //读取服务器返回的数据流(json)
        QByteArray bytes = reply->readAll();  // bytes
        //转换为字符串
        QString string = QString::fromUtf8(bytes);
        
        echo(string);
    }
    else
    {
        // 发生了http错误
        echo(reply->errorString());
    }
    
    reply->deleteLater();
}  

然后在“开始下载”按钮的点击事件里构造post参数,并用post模式发起http访问。

 void MainWindow::on_btn_startDownload_clicked()
{
    //点击了开始下载按钮
    lb_statusText->setText("正在解析...");
    ui->statusbar->addWidget(pb_statusProgress,1);

    QUrl url("为了安全,我在这里没有写请求网址。");

    QByteArray param;
    param.append("url=");
    param.append(ui->le_VideoUrl->text());

    //设置请求头
    QNetworkRequest request;
    request.setUrl(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    request.setHeader(QNetworkRequest::ContentLengthHeader, param.length());

    nam_HTTP->post(request, param);
}  

到这里,用post模式访问http就基本成了,正常的运行结果是会返回一个JSON字符串。

但是,当我点击运行后,弹出来了好多这种类型的编译错误:undefined reference to xxxxx啥啥啥的。

见鬼了,我了个去。。。

大概意思是找不到某个变量的定义。

但是检查了半天,代码里始终是找不到错误的。

而且网上的资料也没有具体说些要注意的。

经过了再三的搜索,才发现,要修改工程配置文件,就是那个.pro文件,这个文件的第一行是: QT += core gui,这个时候,这个工程是没有网络访问权限的,一切的关于网络的类,都会被屏蔽,这才出的这些错误,我们只需要把它改成QT += core gui network就可以了,也就是加一个network,保存,编译,成功。

粘贴一个网址,然后点击下载进行解析,一次运行成功。

得到json数据

下一节是下载视频流。

文章来源:智云一二三科技

文章标题:QT学习:用http的post方式访问URL并获取内容

文章地址:https://www.zhihuclub.com/153070.shtml

关于作者: 智云科技

热门文章

网站地图