分享
  1. 首页
  2. 文章

通过例子学GO语言Web开发之移植网易云音乐API

Jackkakaya · · 2198 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

网易云音乐API

在github中网易云音乐系列的开源项目中最多star应该是NeteaseCloudMusicApi许多好玩的网易云音乐项目都是基于这个项目,今天将带领大家熟悉这个优秀的项目同时移植到GO语言中,通过移植进一步熟悉go语言以及gin框架。

项目地址:

go版本:https://github.com/Jackkakaya/NeteaseCloudMusicGoApi

node原版:https://github.com/Binaryify/NeteaseCloudMusicApi

进入node版github主页

go版本主页

发现node版本的星星真多


node版本因为比较成熟里有doc/test等文档以及测试目录,go中的是抽取所有核心后的。app.go是项目的入口可以从这里开始阅读。因项目逻辑类似,为了学习go语言这里仅分析

go版本。

func InitRouter() *gin.Engine {
 //gin.SetMode(gin.ReleaseMode)
 var musicObain models.MusicObain
 store := persistence.NewInMemoryStore(time.Second)
 r := gin.New()
 // 注册中间件
 r.Use(gin.Logger())
 r.Use(gin.Recovery())
 r.Use(RequestModifyMiddleware)
 files, err := ioutil.ReadDir(ModelPath)
 if err != nil {
 log.Fatalln(err)
 }
 filter := map[string]bool{
 "music_obtain.go": true,
 }
 // 遍历models文件夹,将文件名形成路由
 // 例如文件名:album_sublist.go是将path为album/sublist的请求router path
 // 请求到album_sublist.go 中的AlbumSublist方法处理
 for _, file := range files {
 if filename := file.Name(); filter[filename] == false {
 filename = strings.TrimSuffix(filename, ".go")
 path := fmt.Sprintf("/%v", strings.ReplaceAll(filename, "_", "/"))
 method := strings.ReplaceAll(strings.Title(strings.ReplaceAll(filename, "_", " ")), " ", "")
    // 接受任意请求方法
 r.Any(path, cache.CachePage(store, 2*time.Minute, func(context *gin.Context) {
 query := map[string]interface{}{}
 data, _ := ioutil.ReadAll(context.Request.Body)
 _ = json.Unmarshal(data, &query)
 CookieParseMiddleware(context, &query)
 for key, val := range context.Request.URL.Query() {
 query[key] = val[0]
 }
 for key, val := range context.Request.PostForm {
 query[key] = val
 }
     // 通过放射调用指定包中的结构体下的方法
 respRaw := reflect.ValueOf(&musicObain).MethodByName(method).Call([]reflect.Value{reflect.ValueOf(query)})
 resp := respRaw[0].Interface().(map[string]interface{})
 for _, val := range resp["cookie"].([]string) {
 context.Writer.Header().Add("Set-Cookie", val)
 }
 context.JSON(200, resp)
 }))
 }
 }
 return r
}

项目入口核心函数InitRouter,自动化形成路由,形成路由的规则如下:

请求demo:

localhost:8080/login/cellphone?phone=xxxx&password=xxxx

那么就会将请求打到login_cellphone.go中的LoginCellphone方法处理。

请求核心:pkg/request/request.go

这个包中实现了所有请求的封装,建议熟读此包

业务处理:models/*

业务逻辑举例:

package models

import "github.com/Jackkakaya/NeteaseCloudMusicGoApi/pkg/request"

func (m *MusicObain) ActivateInitProfile(query map[string]interface{}) map[string]interface{} {

data := map[string]interface{}{

"nickname": query["nickname"],

}

options := map[string]interface{}{

"crypto": "eapi",

"cookie": query["cookie"],

"proxy": query["proxy"],

"url": "/api/activate/initProfile",

}

return request.CreateRequest(

"POST", "http://music.163.com/eapi/activate/initProfile",

data,

options)

}

业务逻辑这里,主要是处理好参数,调用pkg/request下的CreateRequest方法去请求。

总结

整个项目最核心的就是gin的路由处理函数InitRouter,自动化形成路由同时加入中间件处理,此外就是pkg中的request下的CreateRequest是对所有请求的封装

models下是所有业务逻辑每个业务逻辑都是调用request/CreateRequest来请求。

最后

项目地址:https://github.com/Jackkakaya/NeteaseCloudMusicGoApi

欢迎下载学习。建议跟着源码学习。欢迎star!!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2198 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏