gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 创建包管理工具,此命令会在当前目录中初始化和创建一个新的go.mod文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。

前言


感谢开源项目gin-vue-admin,以及1010工作室的视频教程

本人学识尚浅,如有错误,请评论指出,谢谢!

详细可见个人博客:https://linzyblog.netlify.app/

本章会用到的技术,不太熟悉的可以去看看我以前的文章

1.快速安装gin框架:https://blog.csdn.net/weixin_46618592/article/details/125540869

2.HTTP请求:https://blog.csdn.net/weixin_46618592/article/details/125565789

3.Gorm入门指南:https://blog.csdn.net/weixin_46618592/article/details/125647217

4.GORM框架进阶之CRUD接口(数据库增删改查操作):https://blog.csdn.net/weixin_46618592/article/details/125740498


一、设计思路


这章动手把前面学过的Gin框架内容和Gorm框架结合做一个简单的API 微服务


40104d4a501d46d7a462d5b1a28c425b.png


我们需要通过前端来完成对数据库数据的增删改查即可,需要如下这样的 API :


1.POST todos/ 添加数据

2.GET todos/ 获取数据库所有数据

3.GET todos/{id} 获取指定 id 的数据

4.PUT todos/{id} 修改指定 id 的数据

5.DELETE todos/{id} 删除指定 id 的数据


二、编写后端请求


创建一个 todos 文件夹,用VSCode打开当前文件夹


1、在Terminal终端输入 go mod


go mod init todo


创建包管理工具,此命令会在当前目录中初始化和创建一个新的go.mod文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。


2、下载并安装所需要的包


go get -u github.com/gin-gonic/gin
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm


3、创建路由


在 todo 文件夹下创建一个名为 main.go 的文件,在 main 文件中创建一个类似下面的路由,将同一个功能模块放到同一个路由分组中,代码更美观易懂


package main
import (
  "github.com/gin-gonic/gin"
)
func main() {
  router := gin.Default()
  v1 := router.Group("/api/v1/todos")
  {
    v1.POST("/", createTodo)
    v1.GET("/", fetchAllTodo)
    v1.GET("/:id", fetchSingleTodo)
    v1.PUT("/:id", updateTodo)
    v1.DELETE("/:id", deleteTodo)
  }
  router.Run()
}


4、数据库连接


现在我们要实现数据库连接就要用到GORM框架,GORM框架是go的一个数据库连接及交互框架,主要是把struct类型数据库记录进行映射,数据库语句复杂的情况下可以直接手写语句,一般用于连接关系型数据库,这里我主要使用MySQL数据库。


1)设计数据表


//数据库字段
type todoModel struct {
  gorm.Model
  Title     string `json:"title"`
  Completed int    `json:"completed"`
}
//处理返回字段
type transformedTodo struct {
  ID        int    `json:"id"`
  Title     string `json:"title"`
  Completed bool   `json:"completed"`
}


2)数据库连接


package main
import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
var db *gorm.DB
func init() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/go_test?charset=utf8&parseTime=True"
  var err error
  db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
  if err != nil {
    panic(err.Error())
  }
  //自动创建数据表
  db.AutoMigrate(&todoModel{})
}


三、实现路由方法


1、创建一条记录


使用到了 Gin 框架中的 Context 上下文来接收 POST 方式传过来的参数,用 Gorm框架 连接数据库使用Save方法或者Create方法都可以来保存相关的数据到数据库,之后会给前端用户返回一个 JSON信息。


//创建一条todo记录
func createTodo(c *gin.Context) {
  completed, err := strconv.Atoi(c.PostForm("completed"))
  if err != nil {
    panic(err.Error())
  }
  todo := todoModel{
    Title:     c.PostForm("title"),
    Completed: completed,
  }
  db.Save(&todo)
  c.JSON(http.StatusCreated, gin.H{
    "status":     http.StatusCreated,
    "message":    "Todo item created successfully",
    "resourceId": todo.ID,
  })
}


  • POST请求


8fb271a466e04769afe42773ca793726.png


  • 数据库


86526a533f854992a3ae5e35407b6931.png


2、查询所有记录


使用到了 Gin 框架中的 GET 请求,没有参数,用 Gorm 框架连接数据库使用Find方法查询所有记录,封装在JSON里返回给前端用户


//获取数据库所有todo
func selectAllTodo(c *gin.Context) {
  var todos []todoModel
  var rq_todos []transformedTodo
  db.Find(&todos)
  if len(todos) <= 0 {
    c.JSON(http.StatusNotFound, gin.H{
      "status":  http.StatusNotFound,
      "message": "No todo found!",
    })
    return
  }
  for _, item := range todos {
    completed := false
    if item.Completed == 1 {
      completed = true
    }
    rq_todos = append(rq_todos, transformedTodo{
      ID:        int(item.ID),
      Title:     item.Title,
      Completed: completed,
    })
  }
  c.JSON(http.StatusOK, gin.H{
    "status": http.StatusOK,
    "data":   rq_todos,
  })
}


  • GET请求


12ab6118d00843de98a18e0dbcc44ede.png


  • 数据库


ef25eef0b8bd45c19280ce2aea0ce219.png


3、查找指定id的记录


使用到了 Gin 框架中的 Context 上下文来接收 GET 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,封装在JSON里返回给前端用户


//查找指定todo
func selectSingleTodo(c *gin.Context) {
  var todo todoModel
  todoID := c.Param("id")
  db.First(&todo, todoID)
  if todo.ID == 0 {
    c.JSON(http.StatusNotFound, gin.H{
      "status":  http.StatusNotFound,
      "message": "No todo found!",
    })
    return
  }
  completed := false
  if todo.Completed == 1 {
    completed = true
  }
  rp_todo := transformedTodo{
    ID:        int(todo.ID),
    Title:     todo.Title,
    Completed: completed,
  }
  c.JSON(http.StatusOK, gin.H{
    "status": http.StatusOK,
    "data":   rp_todo,
  })
}


  • GET请求


cc870b41a0ce4816814ca3e919645e4a.png


4、修改指定id记录


使用到了 Gin 框架中的 Context 上下文来接收 PUT 方式传过来的参数,用 Gorm 框架连接数据库使用Find方法或者First方法查询指定记录,然后通过Update方法修改记录,返回给前端用户修改成功信息。


//修改指定id todo
func updateTodo(c *gin.Context) {
  var todo todoModel
  todoID := c.Param("id")
  db.First(&todo, todoID)
  if todo.ID == 0 {
    c.JSON(http.StatusNotFound, gin.H{
      "status":  http.StatusNotFound,
      "message": "No todo found!",
    })
    return
  }
  completed, _ := strconv.Atoi(c.PostForm("completed"))
  db.Model(&todo).Updates(&todoModel{
    Title:     c.PostForm("title"),
    Completed: completed,
  })
  c.JSON(http.StatusOK, gin.H{
    "status":  http.StatusOK,
    "message": "Todo updated successfully",
  })
}


  • PUT请求


f2cb8e9494de4abdac10bb4e60ae08ed.png


  • 数据库


9d59bbc3dd2e4bbabacc96348c310cc0.png


5、删除指定id记录


使用到了 Gin 框架中的 Context 上下文来接收 DELETE 方式存放在URI里传过来的参数,用 Gorm 框架连接数据库使用First方法或者Find查询指定id记录,用Delete删除指定id记录,返回给前端用户删除成功信息。


//删除指定id todo
func deleteTodo(c *gin.Context) {
  var todo todoModel
  todoID := c.Param("id")
  db.First(&todo, todoID)
  if todo.ID == 0 {
    c.JSON(http.StatusNotFound, gin.H{
      "status":  http.StatusNotFound,
      "message": "No todo found!",
    })
    return
  }
  db.Delete(&todo)
  c.JSON(http.StatusOK, gin.H{
    "status":  http.StatusOK,
    "message": "todo Deleted successfully",
  })
}


  • DELETE请求


ffcd021a161a4fb383fa3e64c4a5b281.png


  • 数据库


7e06099a63bc4d8484793992d9077a54.png


四、结论


这章只是把前面的基础的知识Gin框架和Gorm框架结合一起实现,日志、JWT认证和Casbin框架我还没用到,后面我将会学习gva框架把之前所学全部展现并结合出来

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
102 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
4天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 12 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
13天前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
124 1
|
1月前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态。
|
1月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
1月前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
73 8
|
2月前
|
负载均衡 监控 API
dotnet微服务之API网关Ocelot
Ocelot 是一个基于 .NET 的 API 网关,适用于微服务架构。本文介绍了如何创建一个 Web API 项目并使用 Ocelot 进行 API 请求路由、负载均衡等。通过配置 `ocelot.json` 和修改 `Program.cs`,实现对 `GoodApi` 和 `OrderApi` 两个项目的路由管理。最终,通过访问 `https://localhost:7122/good/Hello` 和 `https://localhost:7122/order/Hello` 验证配置成功。
41 1
dotnet微服务之API网关Ocelot
|
2月前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 10 月产品动态。
|
2月前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
2月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 10 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要