七叶笔记 » golang编程 » 使用GIN,GORM和MySql创建一个Rest API

使用GIN,GORM和MySql创建一个Rest API

(原文作者:Sudeep Timalsina)

资料来源: blog.logrocket.com

Go语言是我们所生活的时代中最炙手可热的编程语言之一。Go使用非常简单,但是提供了与 C ++ 这样的底层语言相似的性能 。Go被认为是提供非常高性能的最快的编程语言。 Gin 是Go令人难以置信的框架之一,它轻巧且速度极快。Gin有趣的功能是它提供了 HttpRouter的 自定义版本, 这使得API路由比其他Go框架更快。据称它比另一个名为 Martini的 Go框架快40倍 并且,与其他框架和其他编程语言相比,它提供了更多的好处。
Gin只是 微 框架,无法像其他框架一样为您提供很多功能。它只是为您提供构建api的必要工具,例如路由,验证等。专家认为,Gin最适合进行长期投资,以充分利用其高性能和灵活性的优势。
今天,我们将使用Go,Gin,Gorm和Mysql数据库创建一个非常简单的API。我们将为字段很少的用户数据执行CRUD操作。您需要对Go有所了解,才能开始我们将要做的项目。
我们走吧!
哇,听起来很棒,不是吗?

安装Go

您会发现很多材料,可以教您如何在计算机中安装Go。我相信您已经在计算机中安装了Go,因为我们将为Go编写中间代码。即使尚未安装,也可以立即安装。我有一篇非常有用的文章对您有所帮助,该文章有助于 在您的linux环境中 安装Go( 。
每当您完成Go的安装或在计算机上安装Go时,只需检查版本即可测试它是否正常运行。

 go version  

建立新工程

在go所在的src内为项目创建一个新文件夹。就我而言,go位于主文件夹中,我在 go的src文件夹内创建了 first-api 文件夹。现在,在您最喜欢的编辑器中打开它,在我的例子中是VSCode。因此,要初始化新模块,我们必须在项目内的vscode终端中输入以下命令。

 go mod init  

如果您稍后将其打开,则 此命令将在保存我们的外部软件包的同时创建 go.mod 文件。

安装包

这些是项目的外部软件包: mysql gin gorm的 sql驱动程序 。输入以下命令以将其安装在项目中。

 go get github.com/go-sql-driver/mysql
go get github.com/gin-gonic/gin
go get github.com/jinzhu/gorm  

项目结构

当然,我们遵循MVC模式来创建模型,视图和控制器的API。但是’V’在这里仍然保持沉默,因为我们现在正在创建API。我们拥有数据库配置,模型,路径,控制器,当然还有我们一直以来最喜欢的Main文件,它是我们项目的启动器。我有用于创建项目结构的快照。

数据库设置

首先,请确保已将mysql安装到计算机上,并确保使用某些工具(如phpmyadmin,mysql workbench或任何其他工具)可以有效地使用数据库。在mysql中创建一个新数据库,然后 在 Config 目录中的 Database.go 文件中 添加数据库配置 。我已经添加了我的配置详细信息,您必须添加自己的配置详细信息。

 //Config/Database.go
package Config
import (
 "fmt"
"github.com/jinzhu/gorm"
)
var DB *gorm.DB
// DBConfig represents db configuration
type DBConfig struct {
 Host     string
 Port     int
 User     string
 DBName   string
 Password string
}
func BuildDBConfig() *DBConfig {
 dbConfig := DBConfig{
  Host:     "localhost",
  Port:     3306,
  User:     "root",
  Password: "1234",
  DBName:   "first_go",
 }
 return &dbConfig
}
func DbURL(dbConfig *DBConfig) string {
 return fmt.Sprintf(
  "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
  dbConfig.User,
  dbConfig.Password,
  dbConfig.Host,
  dbConfig.Port,
  dbConfig.DBName,
 )
}  

建立模型

现在,让我们为用户创建一个包含以下字段的模型:

  • 姓名(name)
  • 电子邮件(email)
  • 电话(phone)
  • 地址(address)

我们 在 Models 目录中创建 UserModel.go 文件 。

 //Models/UserModel.go
package Models
type User struct {
 Id      uint   `json:"id"`
 Name    string `json:"name"`
 Email   string `json:"email"`
 Phone   string `json:"phone"`
 Address string `json:"address"`
}
func (b *User) TableName() string {
 return "user"
}  

配置路由(Routing)

同样,我们为项目创建工艺路线。我们创建了一个小组来调整与用户相关的路由,并且在使用api时必须照顾好这个小组。因此,让我们 在 Routes 文件夹中创建 Routes.go 文件 。我们将在下面看到控制器功能的实现。

 //Routes/Routes.go
package Routes
import (
 "first-api/Controllers"
"github.com/gin-gonic/gin"
)
//SetupRouter ... Configure routes
func SetupRouter() *gin.Engine {
 r := gin.Default()
 grp1 := r.Group("/user-api")
 {
  grp1.GET("user", Controllers.GetUsers)
  grp1.POST("user", Controllers.CreateUser)
  grp1.GET("user/:id", Controllers.GetUserByID)
  grp1.PUT("user/:id", Controllers.UpdateUser)
  grp1.DELETE("user/:id", Controllers.DeleteUser)
 }
 return r
}  

创建控制器(Controller)

我们处理 来自控制器前端的 http请求 。我们创建了不同的功能来处理由路由器路由到控制器的特定请求。我们 在 模型 内部 有 User.go 与数据库进行交互。我们根据从数据库中获得的数据来响应用户。如果没有错误, 则将 响应作为 StatusOK提供 ,如果得到错误,则将提供错误状态。我们在其中创建 User.go 文件 控制器 文件夹。

 //Controllers/User.go
package Controllers
import (
 "first-api/Models"
 "fmt"
 "net/http"
"github.com/gin-gonic/gin"
)
//GetUsers ... Get all users
func GetUsers(c *gin.Context) {
 var user []Models.User
 err := Models.GetAllUsers(&user)
 if err != nil {
  c.AbortWithStatus(http.StatusNotFound)
 } else {
  c.JSON(http.StatusOK, user)
 }
}
//CreateUser ... Create User
func CreateUser(c *gin.Context) {
 var user Models.User
 c.BindJSON(&user)
 err := Models.CreateUser(&user)
 if err != nil {
  fmt.Println(err.Error())
  c.AbortWithStatus(http.StatusNotFound)
 } else {
  c.JSON(http.StatusOK, user)
 }
}
//GetUserByID ... Get the user by id
func GetUserByID(c *gin.Context) {
 id := c.Params.ByName("id")
 var user Models.User
 err := Models.GetUserByID(&user, id)
 if err != nil {
  c.AbortWithStatus(http.StatusNotFound)
 } else {
  c.JSON(http.StatusOK, user)
 }
}
//UpdateUser ... Update the user information
func UpdateUser(c *gin.Context) {
 var user Models.User
 id := c.Params.ByName("id")
 err := Models.GetUserByID(&user, id)
 if err != nil {
  c.JSON(http.StatusNotFound, user)
 }
 c.BindJSON(&user)
 err = Models.UpdateUser(&user, id)
 if err != nil {
  c.AbortWithStatus(http.StatusNotFound)
 } else {
  c.JSON(http.StatusOK, user)
 }
}
//DeleteUser ... Delete the user
func DeleteUser(c *gin.Context) {
 var user Models.User
 id := c.Params.ByName("id")
 err := Models.DeleteUser(&user, id)
 if err != nil {
  c.AbortWithStatus(http.StatusNotFound)
 } else {
  c.JSON(http.StatusOK, gin.H{"id" + id: "is deleted"})
 }
}  

处理请求

这是获取数据并直接与我们的数据库进行交互的关键文件。我们 在 Models 文件夹中创建 User.go 文件 来处理数据库请求。

 //Models/User.go
package Models
import (
 "first-api/Config"
 "fmt"
_ "github.com/go-sql-driver/mysql"
)
//GetAllUsers Fetch all user data
func GetAllUsers(user *[]User) (err error) {
 if err = Config.DB.Find(user).Error; err != nil {
  return err
 }
 return nil
}
//CreateUser ... Insert New data
func CreateUser(user *User) (err error) {
 if err = Config.DB.Create(user).Error; err != nil {
  return err
 }
 return nil
}
//GetUserByID ... Fetch only one user by Id
func GetUserByID(user *User, id string) (err error) {
 if err = Config.DB.Where("id = ?", id).First(user).Error; err != nil {
  return err
 }
 return nil
}
//UpdateUser ... Update user
func UpdateUser(user *User, id string) (err error) {
 fmt.Println(user)
 Config.DB.Save(user)
 return nil
}
//DeleteUser ... Delete user
func DeleteUser(user *User, id string) (err error) {
 Config.DB.Where("id = ?", id).Delete(user)
 return nil
}  

设置服务器

这是我们项目的启动功能。我们连接mysql,在此处自动迁移我们的模式和设置路由器形式。我们必须 在项目的根目录中 创建 main.go。

 //main.go
package main
import (
 "first-api/Config"
 "first-api/Models"
 "first-api/Routes"
 "fmt"
"github.com/jinzhu/gorm"
)
var err error
func main() {
 Config.DB, err = gorm.Open("mysql", Config.DbURL(Config.BuildDBConfig()))
if err != nil {
  fmt.Println("Status:", err)
 }
defer Config.DB.Close()
 Config.DB.AutoMigrate(&Models.User{})
r := Routes.SetupRouter()
 //running
 r.Run()
}  

现在,我们都准备使用Go和Gin测试我们的第一个api!

演示版

  1. 运行以下命令以启动服务器。
 go run main.go  

终点

这些是我们将用于创建,更新,读取和删除用户数据的端点。

  • GET user-api/user → 检索所有用户数据
  • POST ser-api/user →添加新的用户数据
  • GET user- api/user/{id} →检索单个用户数据
  • PUT user- api/user/{id} → 更新的用户数据
  • DELETE user- api/user → 删除用户数据

现在,打开您拥有的端点测试工具;我们将使用 简直很棒的 Postman 。请确保通过Postman以JSON格式插入数据,因为我们不在此模块中使用表单数据。

建立新使用者

在这里,我们将同时创建两个用户。

获取所有用户

获取我们数据库中所有可用的用户。

通过ID获取用户

获取Id = 1的用户的用户信息。

更新用户

为Id = 1的用户更新用户信息。

删除用户

删除Id = 2的用户。

这是我们使用Go,Gin,Gorm和Mysql构建非常非常简单的rest api。Go可以做更多的事情。未来几天,我将与您联系,提供更多与Go相关的文章。如果您对本文有任何疑问,请在下面的评论中让我知道,或者如果您无法覆盖所有内容,那么我的Github存储库中也有完整版本的代码。下篇再见!

敬请关注!

Github存储库: https : //github.com/SudeepTimalsina/first-go

原文地址:

相关文章