让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

你的位置:金都购彩 > 首页 > 状态实战:使用 Fiber + Gorm 构建 Rest API
状态实战:使用 Fiber + Gorm 构建 Rest API
发布日期:2022-05-15 16:07    点击次数:80

环球好,我是模范员幽鬼。

Fiber 动作一个新的 Go 框架,似乎受追捧进程很高,Star 数飙升很快。不泄露这是不是标明,不少 JS/Node 爱重者最先尝试学习 Go 了,对 Go 是善事。

今天这篇著述先容何如使用 Fiber + Gorm 构建 REST API。

1 概览

在这篇著述中,咱们将使用 Fiber[1] 框架,它使用起来额外简便,有一个很好的详尽层,况兼包含咱们创建 API 所需的一切。

对于与数据库的交互,我决定使用 ORM 来使通盘历程更简便、更直觉,因此我决定使用Gorm[2],在我看来,Gorm[3] 是 Go 寰宇中最受接待的 ORM,况兼特质好多。

2 准备职责

本文基于 Go1.17.5。

在土产货创建一个目次 fibergorm,然后参加该目次实施如下号令:

$ go mod init github.com/programmerug/fibergorm go: creating new go.mod: module github.com/programmerug/fibergorm 

接真的施如下号令,安设咱们需要的依赖:(这个先作假施,之后通过 go mod tidy 安设)

go get github.com/gofiber/fiber/v2 go get gorm.io/gorm 

为了便捷,本教程中,咱们使用 SQLite,因为使用了 Gorm,是以哪种干系型数据库对中枢代码莫得什么影响。

3 最先编码

本文以人类的至好——狗为例。

先从界说实体最先,它整个有四个属性:

Name - 狗的名字 Age - 狗的年岁 Breed - 狗的种族(类型) IsGoodBoy - 狗是否是个好孩子

访佛以下内容:

// 文献名:entities/dog.go package entities  import "gorm.io/gorm"  type Dog struct {     gorm.Model     Name      string `json:"name"`     Age       int    `json:"age"`     Breed     string `json:"breed"`     IsGoodBoy bool   `json:"is_good_boy" gorm:"default:true"` } 

注视其中的内嵌类型 gorm.Model,它仅仅界说了一些通用的字段。

type Model struct {     ID        uint `gorm:"primarykey"`     CreatedAt time.Time     UpdatedAt time.Time     DeletedAt DeletedAt `gorm:"index"` } 

因此,咱们透顶不错我方选择是否要镶嵌 gorm.Model。

接着,咱们设置与数据库的连气儿。一般我心爱创建一个名为 Connect() 的函数,它郑重运升沉连气儿,此外还郑重在咱们的数据库中实施搬动(migration),即生成表结构:

// 文献名:config/database.go package config  import (     "github.com/programmerug/fibergorm/entities"     "gorm.io/driver/sqlite"     "gorm.io/gorm" )  var Database *gorm.DB  func Connect() error {     var err error      Database, err = gorm.Open(sqlite.Open("fibergorm.db"), &gorm.Config{})      if err != nil {         panic(err)     }      Database.AutoMigrate(&entities.Dog{})      return nil } 
fibergorm.db 是终末生成的数据库文献 在模范启动时,需要调用 Connect 函数

目下仍是界说了实体并设置了到数据库的连气儿,咱们不错最先处分咱们的处分模范。咱们的每个处分模范都将对应来自 API 的一个路由,每个处分模范只郑重实施一个操作。当先让咱们得到数据库表中的整个记载。

// 文献名:handlers/dog.go package handlers  import (     "github.com/gofiber/fiber/v2"     "github.com/programmerug/fibergorm/config"     "github.com/programmerug/fibergorm/entities" )  func GetDogs(c *fiber.Ctx) error {     var dogs []entities.Dog      config.Database.Find(&dogs)     return c.Status(200).JSON(dogs) }  // ... 

目下把柄将在申请参数中发送的 id 参数得到一札记载。

// 文献名:handlers/dog.go package handlers  // ...  func GetDog(c *fiber.Ctx) error {     id := c.Params("id")     var dog entities.Dog      result := config.Database.Find(&dog, id)      if result.RowsAffected == 0 {         return c.SendStatus(404)     }      return c.Status(200).JSON(&dog) }  // ... 

目下咱们不错得到整个的记载和把柄 id 得到一札记载。但短缺在数据库表中插入新记载的功能。

// 文献名:handlers/dog.go package handlers  // ...  func AddDog(c *fiber.Ctx) error {     dog := new(entities.Dog)      if err := c.BodyParser(dog); err != nil {         return c.Status(503).SendString(err.Error())     }      config.Database.Create(&dog)     return c.Status(201).JSON(dog) }  // ... 

咱们还需要添加更新数据库中现存记载的功能。与咱们仍是终了的访佛,使用id参数来更新特定记载。

// 文献名:handlers/dog.go package handlers  // ...  func UpdateDog(c *fiber.Ctx) error {     dog := new(entities.Dog)     id := c.Params("id")      if err := c.BodyParser(dog); err != nil {         return c.Status(503).SendString(err.Error())     }      config.Database.Where("id = ?", id).Updates(&dog)     return c.Status(200).JSON(dog) }  // ... 终末,咱们需要删除特定记载,再次使 

终末,咱们需要删除特定记载,再次使用 id 参数从咱们的数据库中删除特定记载。

// 文献名:handlers/dog.go package handlers  // ...  func RemoveDog(c *fiber.Ctx) error {     id := c.Params("id")     var dog entities.Dog      result := config.Database.Delete(&dog, id)      if result.RowsAffected == 0 {         return c.SendStatus(404)     }      return c.SendStatus(200) }  // ... 

目下只需要创建咱们的 main 文献,该文献将郑重运升沉与数据库的连气儿以及咱们的 API 路由将在那畛域说,况兼将处分模范与它们进行关联绑定。

// 文献名:main.go package main  import (     "log"      "github.com/gofiber/fiber/v2"     "github.com/programmerug/fibergorm/config"     "github.com/programmerug/fibergorm/handlers" )  func main() {     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.go 

实施 go run main.go:

$ go run main.go   ┌───────────────────────────────────────────────────┐  │                   Fiber v2.24.0                   │  │               http://127.0.0.1:3000               │  │       (bound on host 0.0.0.0 and port 3000)       │  │                                                   │  │ Handlers ............. 7  Processes ........... 1 │  │ Prefork ....... Disabled  PID ............. 89910 │  └───────────────────────────────────────────────────┘ 

借助 postman、curl 之类的用具考证接口的正确性。

因为 fiber Ctx 的 BodyParser 概况判辨 Context-Type 值是:application/json, application/xml, application/x-www-form-urlencoded, multipart/form-data 等的数据,是以,考证 AddDog 的不错摄取你心爱的 Content-Type。

curl --location --request POST 'http://127.0.0.1:3000/dogs' \ --header 'Content-Type: application/json' \ --data '{name:"旺财",age:3,breed:"狼狗",is_good_boy:true}' 

不错通过下载 https://sqlitebrowser.org/dl/ 这个 SQLite 用具稽查数据是否保存得手。

持重的读者可能会发现,生成的数据表字段规则是把柄 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/