当前位置: 首页 > 科技观察

项目实战:使用Fiber+Gorm搭建RestAPI

时间:2023-03-19 17:22:14 科技观察

大家好,我是程序员鬼才。Fiber作为一个新的Go框架,似乎备受追捧,Star数迅速飙升。不知道这是否意味着很多JS/Node爱好者都在努力学习Go,这对Go来说是件好事。今天的帖子描述了如何使用Fiber+Gorm构建RESTAPI。1概述在本文中,我们将使用Fiber[1]框架,它使用起来非常简单,有一个很好的抽象层,并且包括我们创建API所需的一切。关于与数据库的交互,我决定使用ORM来让整个过程更简单直观,所以我决定使用Gorm[2],在我看来,Gorm[3]是Go世界中最流行的ORM,而且功能很多。2准备工作本文基于Go1.17.5。在本地创建一个目录fibergorm,然后进入该目录执行以下命令:$gomodinitgithub.com/programmerug/fibergormgo:creatingnewgo.mod:modulegithub.com/programmerug/fibergorm然后执行以下命令安装我们需要的依赖:(这个不是先执行,再通过gomodtidy安装)gogetgithub.com/gofiber/fiber/v2gogetgorm.io/gorm为了方便,本教程中,我们使用SQLite,因为使用了Gorm,所以没有哪个关系型数据库对核心代码的影响。3开始编码本文以人类朋友——狗为例。我们先来定义实体,一共有四个属性:Name-狗的名字Age-狗的年龄Breed-狗的种族(类型)IsGoodBoy-狗是否是好孩子类似的以下://文件名:entities/dog.gopackageentitiesimport"gorm.io/gorm"typeDogstruct{gorm.ModelNamestring`json:"name"`Ageint`json:"age"`Breedstring`json:"breed"`IsGoodBoybool`json:"is_good_boy"gorm:"default:true"`}注意嵌入类型gorm.Model,它只是定义了一些公共字段。typeModelstruct{IDuint`gorm:"primarykey"`CreatedAttime.TimeUpdatedAttime.TimeDeletedAtDeletedAt`gorm:"index"`}因此,我们可以选择是否嵌入gorm.Model。接下来,我们配置与数据库的连接。一般来说,我喜欢创建一个名为Connect()的函数,它负责初始化连接并另外在我们的数据库中执行迁移,即生成表structure://filename:config/database.gopackageconfigimport("github.com/programmerug/fibergorm/entities""gorm.io/driver/sqlite""gorm.io/gorm")varDatabase*gorm.DBfuncConnect()error{varerrerrorDatabase,err=gorm.Open(sqlite.Open("fibergorm.db"),&gorm.Config{})iferr!=nil{panic(err)}Database.AutoMigrate(&entities.Dog{})returnnil}fibergorm.db是最后生成的数据库文件。当程序启动时,您需要调用Connect函数现在已经定义了实体并配置了与数据库的连接,我们可以开始处理我们的处理程序了。我们的每个处理程序都将对应于来自API的一条路由,并且每个处理程序将只负责执行单个操作。首先让我们获取数据库表中的所有记录。//文件名:handlers/dog.gopackagehandlersimport("github.com/gofiber/fiber/v2""github.com/programmerug/fibergorm/config""github.com/programmerug/fibergorm/entities")funcGetDogs(c*fiber.Ctx)error{vardogs[]entities.Dogconfig.Database.Find(&dogs)returnc.Status(200).JSON(dogs)}//...现在根据将在请求参数。//文件名:handlers/dog.gopackagehandlers//...funcGetDog(c*fiber.Ctx)error{id:=c.Params("id")vardogentities.Dogresult:=config.Database.Find(&dog,id)ifresult.RowsAffected==0{returnc.SendStatus(404)}returnc.Status(200).JSON(&dog)}//...现在我们可以获取所有记录,根据id获取一条记录。但是它缺少在数据库表中插入新记录的功能。//文件名:handlers/dog.gopackagehandlers//...funcAddDog(c*fiber.Ctx)error{dog:=new(entities.Dog)iferr:=c.BodyParser(dog);err!=nil{returnc.Status(503).SendString(err.Error())}config.Database.Create(&dog)returnc.Status(201).JSON(dog)}//...我们还需要添加和更新已有的记录数据库功能。与我们已经实现的类似,使用id参数更新特定记录。//文件名:handlers/dog.gopackagehandlers//...funcUpdateDog(c*fiber.Ctx)error{dog:=new(entities.Dog)id:=c.Params("id")iferr:=c.BodyParser(dog);err!=nil{returnc.Status(503).SendString(err.Error())}config.Database.Where("id=?",id).Updates(&dog)returnc.Status(200).JSON(dog)}//...最后,我们需要删除一条特定的记录,再次最后,我们需要删除一条特定的记录,再次使用id参数从我们的数据库中删除一条特定的记录。//文件名:handlers/dog.gopackagehandlers//...funcRemoveDog(c*fiber.Ctx)error{id:=c.Params("id")vardogentities.Dogresult:=config.Database.Delete(&dog,id)ifresult.RowsAffected==0{returnc.SendStatus(404)}returnc.SendStatus(200)}//...现在只需要创建我们的主文件,它将负责初始化与数据库的连接和我们的API路由where将被定义,处理程序将与它们相关联。//文件名:main.gopackagemainimport("log""github.com/gofiber/fiber/v2""github.com/programmerug/fibergorm/config""github.com/programmerug/fibergorm/handlers")funcmain(){app:=fiber.New()config.Connect()app.Get("/dogs",handlers.GetDogs)app.Get("/dogs/:id",handlers.GetDog)app.Post("/dogs",handlers.AddDog)app.Put("/dogs/:id",handlers.UpdateDog)app.Delete("/dogs/:id",handlers.RemoveDog)log.Fatal(app.Listen(":3000"))}至此,我们就完成了一个简单的CRUD应用。fiber和gorm相关的API,请参考相关文档进一步了解。最后工程目录如下:├──config│└──database.go├──entities│└──dog.go├──fibergorm.db├──go.mod├──go.sum├──handlers│└──dog.go└──main.goexecutegorunmain.go:$gorunmain.go┌────────────────────────────────────────────────────────────────┐│Fiberv2.24.0││http://127.0.0.1:3000││(boundonhost0.0.0.0andport3000)││││Handlers.......7Processes......1││Prefork.......DisabledPID...................89910│└───────────────────────────────────────────────────────────────────────────────────────────────────────┘使用postman、curl等工具验证接口的正确性。因为FiberCtx的BodyParser可以解析Context-Type值为:application/json、application/xml、application/x-www-form-urlencoded、multipart/form-data等的数据,大家可以使用自己喜欢的进行验证添加狗内容类型。curl--location--requestPOST'http://127.0.0.1:3000/dogs'\--header'Content-Type:application/json'\--data'{name:"旺财",age:3,breed:"Wolfdog",is_good_boy:true}'可以通过下载SQLite工具https://sqlitebrowser.org/dl/查看数据是否保存成功。细心的读者可能会发现,生成的数据表的字段顺序是根据Dog中的字段定义顺序来确定的。有强迫症的人可能接受不了,所以在实践中,可以自己定义相关字段,而不是嵌入gorm.Model。综上所述,本文实现了CRUD的功能。希望大家都能真正做到,才能真正掌握。本文参考https://dev.to/franciscomendes10866/how-to-build-rest-api-using-go-fiber-and-gorm-orm-2jbe。本文完整代码:https://github.com/programmerug/fibergorm。参考文献[1]Fiber:https://gofiber.io/[2]Gorm:https://gorm.io/[3]Gorm:https://gorm.io/