一文搞懂Go搭建Restful接口

简介: 一文搞懂Go搭建Restful接口

前提说明

大家都知道,Go语言是云原生技术的主力语言,因此想要更好的学习并掌握云原生技术的前提是能熟练的使用Go语言,今天就带大家再次使用Go语言搭建一个简单的Restful风格的后端服务,其中包含CRUD功能,但是由于能更方便快速的开发完成,web层使用了Gin框架,dao层,即数据库访问层的代码就没有进行数据库的连接,直接操作内存做数据的增删改查,如有详细教程的需要请留言哈~

好滴,废话不多说,在学习这篇文章之前建议大家先了解下除了Go基本语法和设计规范以外,还有Restful的一些要点和Gin框架的基础,这里我就推荐下相关文章吧:

Gin框架:

《快速入门Gin框架搭建HTTP服务》

Restful要点:

《RESTful介绍和使用教程》

具体代码

安装Gin

go get -u github.com/gin-gonic/gin
复制代码

项目结构:

网络异常,图片无法展示
|


cmd/web/main.go

package main
import (
   "go_restful/pkg/web"
)
func main() {
   web.RouterGroup("7000")
}
复制代码

pkg/model/user.go

package model
type User struct {
   Id   int64  `json:"id"`
   Name string `json:"name"`
   Age  int    `json:"age"`
}
复制代码

pkg/dao/user_dao.go

package dao
import (
   "context"
   "go_restful/pkg/model"
   "log"
)
var users []*model.User
func init() {
   userList := make([]*model.User, 0)
   userList = append(userList, &model.User{Id: 1, Name: "zs", Age: 23})
   userList = append(userList, &model.User{Id: 2, Name: "ls", Age: 24})
   userList = append(userList, &model.User{Id: 3, Name: "ww", Age: 25})
   users = userList
}
type UserDAO interface {
   CreateUser(ctx context.Context, user *model.User) (bool, error)
   List(ctx context.Context) ([]*model.User, error)
   GetUserById(ctx context.Context, id int64) (model.User, error)
   DeleteUserById(ctx context.Context, id int64) (bool, error)
   UpdateUserById(ctx context.Context, user model.User) (bool, error)
}
type UserDaoImpl struct {
   UserDB []*model.User
}
func NewUserDaoImpl() *UserDaoImpl {
   return &UserDaoImpl{users}
}
func (u UserDaoImpl) CreateUser(ctx context.Context, user *model.User) (bool, error) {
   users = append(u.UserDB, user)
   printUsers()
   return true, nil
}
func (u UserDaoImpl) List(ctx context.Context) ([]*model.User, error) {
   return u.UserDB, nil
}
func (u UserDaoImpl) GetUserById(ctx context.Context, id int64) (model.User, error) {
   return *u.UserDB[id-1], nil
}
func (u UserDaoImpl) DeleteUserById(ctx context.Context, id int64) (bool, error) {
   newList := make([]*model.User, 0)
   for i := range u.UserDB {
      if i+1 != int(id) {
         newList = append(newList, u.UserDB[i])
      }
   }
   users = newList
   printUsers()
   return true, nil
}
func (u UserDaoImpl) UpdateUserById(ctx context.Context, user model.User) (bool, error) {
   newList := make([]*model.User, 0)
   for i := range u.UserDB {
      if i+1 == int(user.Id) {
         newList = append(newList, &user)
      } else {
         newList = append(newList, u.UserDB[i])
      }
   }
   users = newList
   printUsers()
   return true, nil
}
func printUsers() {
   for i := range users {
      log.Print(users[i])
   }
}
复制代码

pkg/web/controller/user_controller.go

package controller
import (
   "context"
   "encoding/json"
   "github.com/gin-gonic/gin"
   "go_restful/pkg/model"
   "go_restful/pkg/web/controller/impl"
   "io/ioutil"
   "log"
   "strconv"
)
type UserController interface {
   CreateUser(ctx context.Context, user model.User) (bool, error)
   List(ctx context.Context) ([]*model.User, error)
   GetUserById(ctx context.Context, id int64) (model.User, error)
   DeleteUserById(ctx context.Context, id int64) (bool, error)
   UpdateUserById(ctx context.Context, user model.User) (bool, error)
}
//CreateUser 添加User
func CreateUser(c *gin.Context) {
   body := c.Request.Body
   bytes, err := ioutil.ReadAll(body)
   user := model.User{}
   json.Unmarshal(bytes, &user)
   impl.MyUserControllerImpl.CreateUser(c, &user)
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, "success")
}
//List 查看全部
func List(c *gin.Context) {
   list, err := impl.MyUserControllerImpl.List(c)
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, list)
}
//GetUserById 根据ID查看
func GetUserById(c *gin.Context) {
   id := c.Param("id")
   intid, _ := strconv.Atoi(id)
   user, err := impl.MyUserControllerImpl.GetUserById(c, int64(intid))
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, user)
}
//DeleteUserById 根据ID删除
func DeleteUserById(c *gin.Context) {
   id := c.Param("id")
   intid, _ := strconv.Atoi(id)
   res, err := impl.MyUserControllerImpl.DeleteUserById(c, int64(intid))
   if err != nil {
      log.Println(err)
   }
   c.JSON(200, res)
}
//UpdateUserById 根据Id修改
func UpdateUserById(c *gin.Context) {
   body := c.Request.Body
   bytes, err := ioutil.ReadAll(body)
   user := model.User{}
   json.Unmarshal(bytes, &user)
   if err != nil {
      log.Println(err)
   }
   res, err := impl.MyUserControllerImpl.UpdateUserById(c, user)
   c.JSON(200, res)
}
复制代码

pkg/web/controller/impl/user_controller.go

package impl
import (
   "context"
   "go_restful/pkg/dao"
   "go_restful/pkg/model"
)
type UserControllerImpl struct {
   dao *dao.UserDaoImpl
}
var MyUserControllerImpl *UserControllerImpl
func NewUserControllerImpl() *UserControllerImpl {
   return &UserControllerImpl{
      dao: dao.NewUserDaoImpl(),
   }
}
func init() {
   MyUserControllerImpl=NewUserControllerImpl()
}
func (u UserControllerImpl) CreateUser(ctx context.Context, user *model.User) (bool, error) {
   return u.dao.CreateUser(ctx, user)
}
func (u UserControllerImpl) List(ctx context.Context) ([]*model.User, error) {
   return u.dao.List(ctx)
}
func (u UserControllerImpl) GetUserById(ctx context.Context, id int64) (model.User, error) {
   return u.dao.GetUserById(ctx, id)
}
func (u UserControllerImpl) DeleteUserById(ctx context.Context, id int64) (bool, error) {
   return u.dao.DeleteUserById(ctx, id)
}
func (u UserControllerImpl) UpdateUserById(ctx context.Context, user model.User) (bool, error) {
   return u.dao.UpdateUserById(ctx, user)
}
复制代码

pkg/web/router.go

package web
import (
   "github.com/gin-gonic/gin"
   "go_restful/pkg/web/controller"
)
func RouterGroup(port string) {
   r := gin.Default()
   router := r.Group("/")
   {
      router.POST("/save", controller.CreateUser)
      router.GET("/list", controller.List)
      router.GET("/get/:id", controller.GetUserById)
      router.PUT("/update}", controller.UpdateUserById)
      router.DELETE("/delete/:id", controller.DeleteUserById)
   }
   r.Run("127.0.0.1:" + port)
}
复制代码

最后大家自行测试吧~


相关文章
|
16天前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
14 2
|
18天前
|
XML 物联网 API
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
本文作者木头左是物联网工程师,分享如何使用 Python 和 Flask-RESTful 构建一个简单的 RESTful API,实现文件上传功能,特别支持Excel文件。通过安装Flask和Flask-RESTful库,创建Flask应用,实现文件上传接口,并将其添加到API。该方法具有简单易用、灵活、可扩展及社区支持等优点。
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
|
11天前
|
存储 前端开发 安全
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
这篇文章介绍了如何使用Supabase实现RESTful风格的API接口,用于网站分类和子站点的增删改查(CURD)功能。文章首先阐述了表设计,包括ds_categorys和ds_websites两张表的列名、类型和用途,并提到了为每张表添加的user_id和email字段以支持用户身份识别。接着,文章描述了接口设计,以ds_websites表为例,说明了如何通过RESTful API实现CURD功能,并给出了使用SupabaseClient实现插入数据的相关代码。文章最后提供了项目效果预览和总结,指出学习了Nuxt3创建接口及调用Supabase数据库操作。
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
|
10天前
|
XML 安全 API
API攻防-接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
API攻防-接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
|
11天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
19天前
|
SQL 缓存 测试技术
RESTful API设计的最佳实践:构建高效、可维护的Web服务接口
【6月更文挑战第11天】构建高效、可维护的RESTful API涉及多个最佳实践:遵循客户端-服务器架构、无状态性等REST原则;设计时考虑URL结构(动词+宾语,使用标准HTTP方法)、使用HTTP状态码、统一响应格式及错误处理;确保数据安全(HTTPS、认证授权、输入验证);实施版本控制;并提供详细文档和测试用例。这些实践能提升Web服务接口的性能和质量。
|
23天前
|
Go
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
|
2天前
|
存储 API
什么是RESTful接口风格
什么是RESTful接口风格
7 0
|
3天前
使用Jetty编写RESTful接口
使用Jetty编写RESTful接口
6 0
|
26天前
|
存储 Go iOS开发
Go 语言接口
Go 语言接口
16 2