(原文作者:Sudeep Timalsina)
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!
演示版
- 运行以下命令以启动服务器。
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
原文地址: