去年闲着没事干,就封装了下面QQ和Netease音乐的 api
,目的就是通过java可以更便捷的调用,网易云音乐或者qq音乐的api,另外每个接口我都加了注释,对于不懂的参数,通过接口上的注释直接可以查看,不需要一边看在线文档一遍写java代码。
实现了主流音乐api,项目中还允许你快速的去搭建其它第三方音乐api,只需要按照规范写接口即可完成调用
在线文档:
一、QQ音乐API在线文档
二、网易云音乐API在线文档
封装工具的项目源码地址(附快速上手文档):https://github.com/1015770492/yumbo-music-utils
maven中央仓库地址
仓库地址:https://mvnrepository.com/artifact/top.yumbo.music/yumbo-music-utils
引入下面的maven依赖即可快速使用
gav坐标:
<repositories><repository><id>alimaven</id><name>aliyun maven</name><!-- 使用阿里云镜像仓库地址,防止maven去仓库找不到新版本的aliyun镜像仓库地址建议mirrors中也修改,如果已经改好了,则可以去掉这个repositories --><url>https://maven.aliyun.com/repository/central</url></repository>
</repositories><dependencies><!-- https://mvnrepository.com/artifact/top.yumbo.music/yumbo-music-utils --><dependency><groupId>top.yumbo.music</groupId><artifactId>yumbo-music-utils</artifactId><version>1.2.1</version></dependency>
</dependencies>
作为一只喜欢听音乐的程序员,喜欢边听歌边敲代码、喜欢边听歌边学习。
就在我大二的时候我诞生了要自己做网站的想法,大二的时候我通过阿里云的云翼计划购买了学生云服务器,因为便宜后面我续购了几年一下子买到了2024年
如果你不想花钱买服务器想自己搭建一台高性能高带宽的公网服务器,可以看下我前面写过的一些文章
《时隔一年,我又来捣鼓我家移动光猫了,你还不知道如何获取公网ip吗?》
《家用移动光猫(型号:HS8545M5)利用公网ipv6对外提供公网服务。(100M的宽带,真香 )》
从大二开始我就一直想做一个属于自己的博客系统,用于自己日后写博客,这个想法我想了非常的久,因此在后面当我学过非常多的知识后,我对于这个想法有了更多幻想,我想在我的博客系统中加入音乐播放功能。
我模仿了:https://netease-music.fe-mm.com/#/music/playlist的界面,采用Vue+ElementUI
自己设计了一个音乐播放器
下面是大致布局(响应式布局)
采用的是一个单组件
下面的Music.vue就是上面这个布局,github地址:https://github.com/1015770492/music
在我的想法中,我想把 QQ音乐
和 网易云音乐
的 api 进行统一管理,例如搜索一首歌曲的资源,可以统一两个库中的音乐,这样就不容易因为版权问题不能播放。
因此诞生了统一QQ音乐
和 网易云音乐
的 api 的想法。
在我去实现的过程中,我在思考我平常使用的springboot注解例如@Autowired
、@GetMapping
等注解,我想模仿一下springboot中的做法
我想做到这样:
@MusicService(url = "/search/hot",serviceProvider = MusicEnum.NeteaseCloudMusic)
JSONObject jsonObject;// 调用网易云音乐api,将返回的数据注入到这个对象中
当时我想做到的是在局部变量中进行注入,也就是注解作用:@Target({ElementType.LOCAL_VARIABLE})
,但是我失败了,因为通过反射只能得到局部变量的名称,却得不到局部变量的值,也就是实现不了将json注入到jsonObject中。
如果能这样做,那么使用起来最方便,可以直接在需要的地方直接加注解注入进去,然后直接使用。
另外我还要解决一个问题,那就是通过反射得到注解信息后,需要在调用它的时候才发请求(懒加载的含义)也就是代码执行到这个注解的时候才去发请求,得到返回的json数据。
这是一个比较麻烦的事情,我的处理方式是,将反射的时机放在了get
方法中在get的时候执行反射并且将请求得到的数据返回
一个调用的例子
下面是网易云音乐的一个接口
import com.alibaba.fastjson.JSONObject;
import top.yumbo.util.music.musicImpl.netease.NeteaseCloudMusicInfo;public class NeteaseCloudMusicDemo {public static void main(String[] args) {// 得到封装网易云音乐信息的工具类final NeteaseCloudMusicInfo neteaseCloudMusicInfo = new NeteaseCloudMusicInfo();// 调用网易云的热搜服务,返回json数据final JSONObject jsonObject = neteaseCloudMusicInfo.searchHot();System.out.println(jsonObject);// 打印得到的json数据}
}
下面是控制台中打印的信息,最后一行就是json对象的打印,前面两行是反射的时候我为了方便debug
将调用的方法信息都打印一下
当前执行:class top.yumbo.util.music.musicImpl.netease.NeteaseCloudMusicInfo.searchHot()
请求的相对路径:/search/hot
{"result":{"hots":[{"iconType":1,"first":"四季予你","second":1},{"iconType":1,"first":"有何不可","second":1},{"iconType":1,"first":"我的世界守则","second":1},{"iconType":1,"first":"踏山河","second":1},{"iconType":1,"first":"薛之谦","second":1},{"iconType":1,"first":"张杰","second":1},{"iconType":1,"first":"We Can't Stop","second":1},{"iconType":1,"first":"红黑","second":1},{"iconType":1,"first":"起风了","second":1},{"iconType":1,"first":"林俊杰","second":1}]},"code":200}
项目地址
https://github.com/1015770492/yumbo-music-utils
如果想要调用QQ音乐的api则调用我写好的工具类就行了
也就是替换上面new NeteaseCloudMusicInfo();
改为new QQMusicInfo();
因为两个音乐平台的地址以及功能是不一样的,因此我没有将他们再进行抽象化,准备后面通过类来完成它们的统一。
也为了日后方便,我计划会将他做成一个工具类通过maven发布到maven仓库中,这个工具或许日后我会把它做成springboot启动器以微服务的方式暴露出去。
项目后期工作
做好了这个架子,后面就非常简单,只需要按照文档
网易云音乐api文档在线地址
QQ音乐api文档在线地址
如下写封装方法即可
以热搜/search/hot
为例