• 演示开发的软件版本:QT6.3.1

所需库

  • QNetworkAccessManager——访问网络所需的主库
  • QNetworkReply——获取网络返回的类(离不开主库)
  • QNetworkRequest——发送网络请求的类(离不开主库)
  • QUrl——链接库
  • QByteArray——字节库

下面是关于json返回请求的处理有关库

  • QJsonDocument
  • QJsonObject
  • QJsonValue
  • QFileDialog

原理说明

通过QNetworkAccessManager类可以创建一个成员与其它QNetwork的类互相配合达到请求API,再通过json处理相关的库将API返回的请求进行处理提取值来获取我们所需的信息

代码演示

在编写代码前一定要在pro文件中加入network模块

//demo.h
#include <dialog.h>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QEventLoop>
#include <QFileDialog>

QJsonDocument({"code":200,"message":{"p":"1","title":"萌新,第一次剪辑","type":"video","url":"https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/09/37/936063709/936063709-1-16.mp4?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1674024104&gen=playurlv2&os=akam&oi=764037100&trid=3c1edb8dc1284194b85f51f48c17df06h&mid=0&platform=html5&upsig=fe4e8047da12bc744dfdbbdb6a0f6377&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1674024104~hmac=4fe6136d43c97b6c90fac3bc8392aafdd78d7fe0adee0eeb41679c12be475368&bvc=vod&nettype=0&bw=50285&logo=80000000","user":"Lliye_","userId":617595663}})
QJsonObject({"code":200,"message":{"p":"1","title":"萌新,第一次剪辑","type":"video","url":"https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/09/37/936063709/936063709-1-16.mp4?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1674024104&gen=playurlv2&os=akam&oi=764037100&trid=3c1edb8dc1284194b85f51f48c17df06h&mid=0&platform=html5&upsig=fe4e8047da12bc744dfdbbdb6a0f6377&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1674024104~hmac=4fe6136d43c97b6c90fac3bc8392aafdd78d7fe0adee0eeb41679c12be475368&bvc=vod&nettype=0&bw=50285&logo=80000000","user":"Lliye_","userId":617595663}})

例如我获取的API内容,里面的相关视频地址都在url中,而url包括在message中,所以我们总共进行二次提取

#include <demo.h>
QString neturl;//最后提取的url结果
 QNetworkAccessManager *manager = new QNetworkAccessManager(this);//创建网络访问成员
    QUrl url1;
    url1 = "https://xiaobapi.top/api/xb/api/tiktok_ks.php?url=";   //api链接
    QUrl url2(ui->lineEdit->text());//获取列表输入内容
    QNetworkReply *reply = manager->get(QNetworkRequest(url1.toString()+url2.toString()));//发送请求
     connect(reply,&QNetworkReply::finished,this,[=]{
        QByteArray data = reply->readAll();//获取API返回的值
        //处理数据
        QJsonDocument jsonDoc = QJsonDocument::fromJson(data);//转换成json
        qDebug()<<jsonDoc;
  
        QJsonObject jsonObject = jsonDoc.object();//转化成Object
        qDebug()<<jsonObject;

        QJsonValue message = jsonObject.value("message");//读值

        QJsonObject messageObject = message.toObject();//二次转化成Object

        QJsonValue netvideoname = messageObject.value("title");//进一步获取message中的值

        ui->videoname->setText(netvideoname.toString());
/*在开发过程中,可能遇到double类型的返回值
 *按代码写就可以取消科学计数法导致无法正常userid
 */

        QJsonValue netvideomakerid = messageObject.value("userId");
        double temp = netvideomakerid.toDouble();//由于id是double类型,得进行处理
        ui->userid->setText(QString::number(temp,'f',0));//f是格式化浮点数,0表示输出小数点后0位,也就是不用输出小数点

         QJsonValue url3 = messageObject.value("url");
         neturl = url3.toString();

视频处理

视频处理也是需要QNetwork有关类的运用,代码中loop的使用是因为一个视频由于下载要不停的请求读取,所以循环是必要的,否则无法下载,该代码不适合大文件下载,会造成假死现象,如果是大文件,建议使用多线程

void dealData(){
         QNetworkAccessManager *dmanager = new QNetworkAccessManager(this);
         QNetworkReply *dreply = dmanager->get(QNetworkRequest(neturl));
         //下载视频
         QEventLoop loop;//循环请求数据
         connect(dreply,&QNetworkReply::finished,&loop,&QEventLoop::quit);//请求结束停止循环

         connect(dreply,&QNetworkReply::readyRead,this,[=]{
             QString fileName = QFileDialog::getSaveFileName(nullptr, tr("保存文件"), "", tr("视频文件 (*.mp4)"));//保存文件
             QFile file(fileName);
             if (file.open(QIODevice::WriteOnly)) {
                 file.write(dreply->readAll());
                 file.close();
              }
        });
}

如需代码参考,在文章末尾会提供多种下载方式

文件下载

普通下载

https://github.com/lmyz6/bilivideo

私人高速资源服务器下载

该部分仅登录用户可见

最后修改:2023 年 01 月 27 日
你的助力是我更新的动力