名目实战:应用 Fiber + Gorm 构建 Rest API

发布日期:2022-08-07 15:48    点击次数:61

巨匠好,我是顺序员幽鬼。

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/progra妹妹erug/fibergorm go: creating new go.mod: module github.com/progra妹妹erug/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/progra妹妹erug/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/progra妹妹erug/fibergorm/config"     "github.com/progra妹妹erug/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/progra妹妹erug/fibergorm/config"     "github.com/progra妹妹erug/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/progra妹妹erug/fibergorm。

参考材料

[1]Fiber: https://gofiber.io/

[2]Gorm: https://gorm.io/

[3]Gorm: https://gorm.io/

 



 




Powered by 手机森林舞会游戏客户端首页 @2013-2022 RSS地图 HTML地图