Golang之Gin(主要)+Gorm框架的使用--实践选题 | 青训营

234 阅读6分钟

一、简介(主要介绍gin)

Gin是一个使用Go语言编写的轻量级Web框架。它具有简洁、高效和易用的特点,非常适合构建快速而可靠的Web应用程序。

以下是一些关于Gin框架的重要特性:

  1. 快速:Gin框架基于Radix树实现路由,这使得它比其他常见的Go Web框架更快。它还通过最小化内存分配和优化HTTP性能来提高性能。
  2. 中间件支持:Gin提供了中间件支持,允许你在请求处理过程中添加一系列功能,例如日志记录、认证、缓存等。这使得开发者可以轻松地扩展和定制自己的应用程序。
  3. 路由组:Gin框架支持路由组,可以帮助你将相关的路由进行分组管理。这对于构建大型应用程序或者模块化的API非常有用。
  4. 参数绑定和验证:Gin框架提供了强大的参数绑定和验证功能。它支持多种数据格式,包括JSON、XML、表单数据等,并且可以自动将请求数据绑定到结构体中。
  5. 错误处理:Gin框架提供了统一的错误处理机制,可以方便地处理HTTP请求中的错误情况,并返回适当的错误响应。
  6. 渲染模板:Gin框架支持使用多种模板引擎进行页面渲染,例如HTML、JSON、XML等。你可以选择自己喜欢的模板引擎来生成动态内容。

二、Gin框架的安装

  1. 首先需要安装Gin的相关依赖。打开终端或命令提示符,执行以下命令下载并安装Gin框架的包:

    go get -u github.com/gin-gonic/gin
    
  2. 在你的Go项目中,可以通过导入Gin框架的包来使用它。在你的代码文件中添加以下导入语句:

    import "github.com/gin-gonic/gin"
    
  3. 现在,你可以开始使用Gin框架来构建Web应用程序了。创建一个新的Go文件,编写你的应用程序代码,并引入Gin框架的相关函数和结构体。

三、restful风格

RESTful风格是一种设计和构建Web服务的方式,它遵循一些规范和原则,使得API更加可读、可扩展和易于使用。下面是一些常见的RESTful风格的设计准则:

  1. 使用合适的HTTP方法:使用HTTP的不同方法(GET、POST、PUT、DELETE等)来表示不同的操作,如获取资源、创建资源、更新资源和删除资源。
  2. 使用清晰的URL结构:URL应该使用名词来表示资源,避免使用动词。例如,/todos表示所有的Todo资源,/todos/1表示ID为1的Todo资源。
  3. 使用HTTP状态码:根据请求的结果,返回合适的HTTP状态码。常见的状态码包括200(OK)、201(Created)、400(Bad Request)、404(Not Found)和500(Internal Server Error)等。
  4. 使用合适的HTTP头部:使用适当的HTTP头部来提供额外的信息,如Content-Type、Authorization和ETag等。
  5. 使用请求体和响应体:对于需要传递数据的请求,使用请求体来发送数据。对于返回数据的响应,使用响应体来包含数据。
  6. 使用版本控制:如果API的功能会发生变化,可以考虑使用版本控制来管理不同版本的API。例如,使用URL路径中的版本号,如/v1/todos
  7. 使用过滤和排序:通过查询参数来支持过滤和排序。例如,使用/todos?status=completed来获取已完成的Todo资源。
  8. 使用合适的错误处理:当出现错误时,返回清晰的错误信息,并使用适当的HTTP状态码表示错误类型。
  9. 使用HATEOAS:HATEOAS(Hypermedia as the Engine of Application State)允许客户端通过API返回的超链接来发现和访问相关资源。

在这篇文章的简单使用中,我们主要是get,post,put,delete相关。

四、使用Gin框架创建基本RESTful API的示例代码

1、创建一个通用的web接口
//创建web接口  
r := gin.Default()
//端口号,如果不写默认是8080端口
PORT := "3001"  
r.Run(":" + PORT)
2、get请求

c.JSON()是Gin框架中的一个方法,用于返回JSON格式的响应给客户端。

该方法有两个参数:

  • 第一个参数是HTTP状态码,表示请求的处理结果。常见的状态码有200(OK)、201(Created)、400(Bad Request)、404(Not Found)和500(Internal Server Error)等。
  • 第二个参数是一个接口类型的数据,用于构建JSON响应的内容。可以使用Gin框架提供的gin.H来创建一个字典类型的数据,也可以使用自定义的结构体或其他数据类型。
r.GET("/", func(c *gin.Context) {  
    //成功返回代码200  
    c.JSON(200, gin.H{  
        "message": "请求成功",  
    })  
})
3、post请求

c.ShouldBindJSON()是Gin框架中的一个方法,用于将请求体中的JSON数据绑定到指定的结构体上。

在使用RESTful API时,客户端通常会通过请求体发送JSON格式的数据。为了方便处理这些数据,Gin框架提供了c.ShouldBindJSON()方法来自动解析和绑定JSON数据。

该方法有一个参数:

参数是一个指向结构体的指针,用于接收解析后的JSON数据。

//增加  
r.POST("/user/add", func(c *gin.Context) {  
    var data List  
    //模型绑定,从前段接收的数据  
    err := c.ShouldBindJSON(&data)  
    //判断绑定是否有错  
    if err != nil {  
        c.JSON(200, gin.H{  
            "msg": "添加失败",  
            "data": gin.H{},  
            "code": 400,  
    })  
    } else {  
        //请求成功进行数据库操作  
        db.Create(&data) //创建一条数据到数据库中  
  
        c.JSON(200, gin.H{  
            "msg": "添加成功",  
            "data": data,  
            "code": 200,  
        })  
    }  
})
4、put请求

发起put请求,代码中有相关注释

//修改信息  
r.PUT("/user/update/:id", func(c *gin.Context) {  
    var data List  
    //接收路径参数上的id,如果是键值对形式用c.Query()  
    id := c.Param("id")  
    //查找是否存在这条信息  
    //db.Where("id=?",id).Find(&data)  
    db.Select("id").Where("id=?", id).Find(&data)  
  
    //判断id是否存在  
    if data.ID == 0 {  
        c.JSON(200, gin.H{  
            "msg": "id不存在",  
            "code": 400,  
        })  
    } else {  
        err := c.ShouldBindJSON(&data)  
        if err != nil {  
            c.JSON(200, gin.H{  
                "msg": "修改失败",  
                "code": 400,  
            })  
        } else {  
            db.Where("id=?", id).Updates(&data)  
            c.JSON(200, gin.H{  
                "msg": "修改成功",  
                "code": 200,  
            })  
        }  
    }  
})
5、delete请求

c.Param()是Gin框架中的一个方法,用于获取URL中的参数。在RESTful API中,我们可以使用URL参数来传递数据或标识资源。

例如,假设我们有一个处理用户信息的API,其中包含一个获取特定用户信息的路由:

r.GET("/users/:id", getUser)

在上面的代码中,:id是一个URL参数,表示要获取的用户的ID。

在处理该路由的处理函数中,我们可以使用c.Param()方法来获取该参数的值:

func getUser(c *gin.Context) {
    userID := c.Param("id")
    // 根据userID获取用户信息的逻辑...
}

在上面的代码中,c.Param("id")会返回URL中对应参数的值,即获取到的用户ID。

r.DELETE("/user/delete/:id", func(c *gin.Context) {  
    var data []List  
    //接收路径参数上的id,如果是键值对形式用c.Query()  
    id := c.Param("id")  
  
    //判断id是否存在  
    db.Where("id=?", id).Find(&data)  
  
    //id存在就删除,没有就报错  
    if len(data) == 0 {  
        c.JSON(200, gin.H{  
            "msg": "id没有找到,删除失败",  
            "code": 400,  
        })  
    } else {  
        db.Where("id=?", id).Delete(&data)  
  
        c.JSON(200, gin.H{  
            "msg": "删除成功",  
            "code": 200,  
        })  
    }  
})