QT学习笔记02_网易云api

网易云api


搜索:
http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=(输入音乐名称)&type=1&offset=0&total=true&limit=20

limit:返回数据条数(每页获取的数量),默认为20,可以自行更改
offset:偏移量(翻页),offset需要是limit的倍数
type:搜索的类型
type=1           单曲
type=10         专辑
type=100        歌手
type=1000      歌单
type=1002      用户
type=1004      MV
type=1006      歌词
type=1009      主播电台

评论
http://music.163.com/api/v1/resource/comments/R_SO_4_{歌曲ID}?limit=20&offset=0
 
歌单
https://music.163.com/api/playlist/detail?id={歌单ID}
 
用户信息
https://music.163.com/api/v1/user/detail/{用户ID}
 
歌词
https://music.163.com/api/song/lyric?id={歌曲ID}&lv=1&kv=1&tv=-1

歌手专辑
http://music.163.com/api/artist/albums/{歌手ID}?id={歌手ID}&offset=0&total=true&limit=10
 
专辑信息
http://music.163.com/api/album/{专辑ID}?ext=true&id={专辑ID}&offset=0&total=true&limit=10
 
歌曲信息
http://music.163.com/api/song/detail/?id={歌曲ID}&ids=%5B{歌曲ID}%5D
 
MV
http://music.163.com/api/mv/detail?id={MV的ID}&type=mp4

首先需要在QT项目的.pro文件里加入network模块:QT +=network

一、请求:

    QNetworkAccessManager* manager;

创建网络访问管理器 。

void MainWindow::on_pushButton_Searching_clicked()
{
    if(ui->textEdit_Searchtext->toPlainText()==""){
        return;
    }
    QNetworkRequest r;
    QString s = ui->textEdit_Searchtext->toPlainText();
    QString str = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={"+s+"}&type=1&offset=0&total=true&limit=4";
    r.setUrl(str);
    manager->get(r);
}

这里s是搜索的关键词。
QNetworkRequest保存通过网络发送请求所需的信息。
使用QNetworkAccessManager发送get请求。

二、解析返回的信息

首先在QNetworkAccessManager的get()完成后,会触发finished信号
将其与解析函数链接,这样一旦完成请求就会立即触发解析函数。

connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(databack(QNetworkReply *)));
void MainWindow::databack(QNetworkReply *reply){
    
    //读取所有信息
    searchInfo=reply->readAll();   
    //错误信息
    QJsonParseError err;
    //将返回的文本信息转换为json文档对象
    QJsonDocument json_recv = QJsonDocument::fromJson(searchInfo,&err);

    //判断是否符合语法
    if(err.error != QJsonParseError::NoError){             
        qDebug() <<"格式错误"<< err.errorString();
        return;
    }

    QJsonObject totalObject = json_recv.object();

    // 列出json里所有的key
    QStringList keys = totalObject.keys();
    //如果keys包含"result"
    if(keys.contains("result")){
  
    //就将带 result 的内容提取后转换为对象
    QJsonObject resultObject = totalObject["result"].toObject();     
    
    //保存result所有key
    QStringList resultKeys = resultObject.keys();
    
    //如果key为songs
    if(resultKeys.contains("songs")){
       QJsonArray array = resultObject["songs"].toArray();
       
       //获取歌曲中的信息
       for(auto i : array){                  
       QJsonObject object = i.toObject();
       musicId = object["id"].toInt();                         // 音乐id
       musicDuration = object["duration"].toInt();             // 音乐长度
       musicName = object["name"].toString();                  // 音乐名
       mvId = object["mvid"].toInt();                          // mvid
       QStringList artistsKeys = object.keys();
       if(artistsKeys.contains("artists")){
       QJsonArray artistsArray = object["artists"].toArray();
       for(auto j : artistsArray){
               QJsonObject object2 = j.toObject();
               singerName = object2["name"].toString();         // 歌手名
       }
    }
    //包含专辑
    if(artistsKeys.contains("album")){
        QJsonObject albumObjct = object["album"].toObject();
        albumName = albumObjct["name"].toString();            // 专辑名
    }

    //音乐的url地址
    QString Musicurl = 
    QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId);

    MusicList.append(Musicurl);
    MusicDurationList.append(musicDuration);

    ui->listWidget_Musiclist->addItem(QString::number(musicId)+
    "  音乐名:"+musicName+
    "  歌手名:"+singerName+
    "  总时长:"+QString::number(musicDuration)+
    "  专辑名:"+albumName);
            }
        }
    }
}

如果我们以:"http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={
杀死那个石家庄人}&type=1&offset=0&total=true&limit=1"  执行请求。
会得到文本信息

"{\"result\":{\"songs\":[{\"id\":386844,\"name\":\"\xE6\x9D\x80\xE6\xAD\xBB\xE9\x82\xA3\xE4\xB8\xAA\xE7\x9F\xB3\xE5\xAE\xB6\xE5\xBA\x84\xE4\xBA\xBA\",\"artists\":[{\"id\":13223,\"name\":\"\xE4\xB8\x87\xE8\x83\xBD\xE9\x9D\x92\xE5\xB9\xB4\xE6\x97\x85\xE5\xBA\x97\",\"picUrl\":null,\"alias\":[],\"albumSize\":0,\"picId\":0,\"fansGroup\":null,\"img1v1Url\":\"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg\",\"img1v1\":0,\"trans\":null}],\"album\":{\"id\":38306,\"name\":\"\xE4\xB8\x87\xE8\x83\xBD\xE9\x9D\x92\xE5\xB9\xB4\xE6\x97\x85\xE5\xBA\x97 \xE5\x90\x8C\xE5\x90\x8D\xE4\xB8\x93\xE8\xBE\x91\",\"artist\":{\"id\":0,\"name\":\"\",\"picUrl\":null,\"alias\":[],\"albumSize\":0,\"picId\":0,\"fansGroup\":null,\"img1v1Url\":\"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg\",\"img1v1\":0,\"trans\":null},\"publishTime\":1289491200000,\"size\":8,\"copyrightId\":-1,\"status\":1,\"picId\":108851651165850,\"mark\":0},\"duration\":344253,\"copyrightId\":0,\"status\":0,\"alias\":[],\"rtype\":0,\"ftype\":0,\"mvid\":384356,\"fee\":8,\"rUrl\":null,\"mark\":17179877376}],\"songCount\":300},\"code\":200}"

转换为json对象后:

QJsonObject({"code":200,"result":{"songCount":300,"songs":[{"album":{"artist":{"albumSize":0,"alias":[],"fansGroup":null,"id":0,"img1v1":0,"img1v1Url":"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"","picId":0,"picUrl":null,"trans":null},"copyrightId":-1,"id":38306,"mark":0,"name":"万能青年旅店 同名专辑","picId":108851651165850,"publishTime":1289491200000,"size":8,"status":1},"alias":[],"artists":[{"albumSize":0,"alias":[],"fansGroup":null,"id":13223,"img1v1":0,"img1v1Url":"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"万能青年旅店","picId":0,"picUrl":null,"trans":null}],"copyrightId":0,"duration":344253,"fee":8,"ftype":0,"id":386844,"mark":17179877376,"mvid":384356,"name":"杀死那个石家庄人","rUrl":null,"rtype":0,"status":0}]}})

 其中"code" "result" 就是是其中的keys
(在 json 文本中 ,{}里面是QJsonObject对象, []里面是QJsonArray)

我们需要的是result,便将result中所有的内容提取出来。
得到:

QJsonObject({"songCount":300,"songs":[{"album":{"artist":{"albumSize":0,"alias":[],"fansGroup":null,"id":0,"img1v1":0,"img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"","picId":0,"picUrl":null,"trans":null},"copyrightId":-1,"id":38306,"mark":0,"name":"万能青年旅店 同名专辑","picId":108851651165850,"publishTime":1289491200000,"size":8,"status":1},"alias":[],"artists":[{"albumSize":0,"alias":[],"fansGroup":null,"id":13223,"img1v1":0,"img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"万能青年旅店","picId":0,"picUrl":null,"trans":null}],"copyrightId":0,"duration":344253,"fee":8,"ftype":0,"id":386844,"mark":17179877376,"mvid":384356,"name":"杀死那个石家庄人","rUrl":null,"rtype":0,"status":0}]})

其中"songCount" "songs"就是result中的keys。
而在result中,我们需要的所有歌曲信息就在"songs"里。

注意[]里面使用QJsonArray存储。
"songs"里可能包含了多个搜索结果的音乐,这时候需要遍历,逐一处理。

最后是播放,使用QT的multimedia模块以url播放

QString Musicurl =QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId);

 需要用到"songs"里的"id"。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值