go的入门指Gin的使用(6)|青训营

185 阅读11分钟

介绍

  • Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
  • 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错
  • 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范

在Go语言中,Gin是一个轻量级的Web框架,用于快速构建高性能的Web应用程序和API服务。Gin提供了简洁的API和丰富的功能,使得开发者可以快速搭建起一个稳定和高效的Web应用。

以下是Gin框架的一些主要特点和用途:

  1. 快速和高效:Gin采用了基于Radix树的路由实现,具备很高的路由匹配性能。通过减少内存分配和使用一些高效的设计,Gin能够处理大量的请求并保持低延迟。
  2. 简单易用:Gin提供了简洁且易于使用的API接口,使得开发者可以快速上手。它有清晰的文档和丰富的示例代码,为开发者提供了很好的参考和学习资源。
  3. 中间件支持:Gin支持使用中间件来处理请求的前置和后置逻辑。例如,可以使用日志中间件记录请求日志、使用身份验证中间件实现身份验证等。这样可以将业务逻辑和非业务逻辑分离,提高代码的可读性和可维护性。
  4. 路由组和参数绑定:Gin允许通过路由组来进行URL的嵌套和分组管理,提高了路由的可扩展性和组织性。Gin还提供了参数绑定功能,可以将请求参数自动绑定到结构体或变量上,简化了参数解析和校验的过程。
  5. 渲染和模板支持:Gin支持多种渲染方式,包括JSON、XML、HTML、YAML等。同时,它也可以集成常用的模板引擎,例如Go自带的html/template或第三方的模板引擎,使得开发者可以方便地生成动态内容并进行页面渲染。

总的来说,Gin框架在Go语言中的作用是提供一个快速、高效和易用的Web开发框架,帮助开发者快速构建稳定和高性能的Web应用程序和API服务。无论是小型项目还是大规模的分布式系统,Gin都能够提供良好的支持和帮助。

安装Gin

要安装Gin软件包,您需要安装Go并首先设置Go工作区。

1.首先需要安装Go(需要1.10+版本),然后可以使用下面的Go命令安装Gin。

go get -u github.com/gin-gonic/gin

2.将其导入您的代码中:

import "github.com/gin-gonic/gin"

3.(可选)导入net/http。例如,如果使用常量,则需要这样做http.StatusOK。

import "net/http"

初次使用

安装好Gin后,使用Gin框架创建一个简单的Web应用程序的示。

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default() // 创建Gin实例
       
 // gin.Context,封装了request和response

	r.GET("/", func(c *gin.Context) { // 定义根路径的GET请求处理函数
        
		c.String(http.StatusOK, "hellogo!") // 返回"hellogo!"
	})

	r.Run(":8080") // 运行Web服务器,监听端口8080
}


通过导入github.com/gin-gonic/gin包,我们可以使用Gin框架提供的功能。在main函数中,使用gin.Default()方法创建了一个默认的Gin路由实例r

接下来,使用r.GET方法定义了一个根路径/的GET请求处理函数。当用户访问根路径时,会执行传入的匿名函数。在这个例子中,函数使用c.String方法返回了一个字符串"hellogo!"作为响应内容,并设置状态码为http.StatusOK表示成功。

最后,使用r.Run方法启动Web服务器,监听在本地的8080端口,等待接收和处理请求。

我们可以运行这段代码,然后在浏览器中访问http://localhost:8080,就能看到页面显示"hellogo!"。这个简单示例展示了使用Gin框架快速建立一个Web应用程序的基本流程。

运行结果:

image.png

API参数

API参数有什么用?

API参数在API开发中扮演着非常重要的角色,用于向API发送额外的数据或指令,以便服务器可以根据这些参数进行相应的操作和返回结果。以下是API参数的一些常见用途:

  1. 数据筛选和排序:通过参数,可以指定对数据进行筛选、排序或限制返回结果的方式。例如,可以使用filter参数来筛选满足特定条件的数据,使用sort参数来对数据进行排序,使用limitoffset参数进行分页控制。
  2. 搜索和查询:API参数可以用于执行搜索操作,允许传递关键字、查询语句或其他搜索参数。服务器可以根据这些参数返回匹配的结果。例如,可以使用q参数来进行全文搜索,使用category参数来指定特定类别的数据。
  3. 身份验证和授权:API参数可用于传递身份验证令牌或其他凭证信息,以进行身份验证和授权操作。服务器可以验证参数中的令牌,并根据用户的访问权限返回相应的结果。
  4. 自定义选项和配置:API参数可以用于传递自定义选项和配置信息,以定制化API的行为。例如,可以使用参数来启用/禁用特定功能,设置默认值或自定义行为。
  5. 过滤和聚合:通过参数,可以指定对数据进行过滤和聚合操作。例如,可以使用参数来指定时间范围、数值范围或其他条件,以获取特定的数据聚合结果。
  6. 地理位置和地图服务:API参数可用于指定地理位置坐标、搜索半径或其它地图相关参数,以便服务器返回相关的地理位置数据。
  7. 错误和异常处理:API参数也可以用于传递错误和异常信息。例如,使用特定的错误代码或标识符来指示特定类型的错误,或使用debug参数来请求详细的错误堆栈跟踪信息。

API参数的具体用途取决于API的设计和业务需求。通过适当使用参数,可以实现更灵活、可定制的API交互和数据操作,提供更好的用户体验和功能扩展性。

API参数的获取

通过gin.ContextParam方法来获取API参数。

package main

import (
    "net/http"
    "strings"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default() // 创建Gin实例

    r.GET("/user/:name/*action", func(c *gin.Context) { // 定义带有参数的路由
        name := c.Param("name") // 获取name参数值
        action := c.Param("action") // 获取action参数值
        action = strings.Trim(action, "/") // 去除action参数值末尾的斜杠"/"
        c.String(http.StatusOK, name+" is "+action) // 返回带有参数值的字符串
    })

    r.Run(":8000") // 运行Web服务器,监听端口8000
}

这段代码创建了一个默认的Gin路由实例r。然后,通过r.GET方法定义了一个带有参数的路由,该路由使用/user/:name/*action的格式进行匹配。

当用户向/user/:name/*action发送GET请求时,Gin将执行回调函数。回调函数中,使用c.Param方法获取:name*action路由参数的值,并将它们分别保存在nameaction变量中。

然后,使用strings.Trim方法去除action变量末尾的斜杠/。最后,使用c.String方法返回一个字符串,其中包含了带有参数值的信息。

最后,通过r.Run方法运行Web服务器,并监听在本地的8000端口,等待接收和处理请求。

你可以通过访问http://localhost:8000/user/John/do/something来测试这个路由。其中,:name参数的值是John*action参数的值是do/something。返回的响应将是John is do/something

在终端运行后的结果:

image.png

image.png

URL参数

URL参数有什么用?

URL参数在API开发中有很多用途。以下是一些常见的用途:

  1. 过滤和排序:通过URL参数,可以向服务器发送过滤和排序的指令,以获取特定条件下的数据结果。例如,可以使用?status=active来获取状态为激活的用户列表,或使用?sort=name&order=asc来按名称升序排列数据。
  2. 分页:使用URL参数来实现分页功能。可以通过?page=2&limit=10来请求第2页,每页显示10条数据。
  3. 搜索:URL参数可以用于在服务器端执行搜索操作。例如,使用?q=keyword来在用户列表中搜索包含关键字的用户。
  4. 身份验证和授权:可以将身份验证令牌(如Bearer Token)作为URL参数发送,用于对API进行身份验证和授权。例如,使用?token=xxxxxx来发送访问令牌。
  5. 传递配置信息:可以使用URL参数向服务器传递配置信息或特定的操作指令。例如,使用?debug=true来启用调试模式,或使用?format=json来指定返回结果的格式。
  6. 地理位置和地图服务:URL参数可用于指定地理位置坐标、搜索范围或地图视图等参数,以便服务器返回相关的地理位置数据。
  7. 数据筛选和聚合:通过URL参数,可以向服务器发送筛选和聚合数据的指令。例如,使用?filter=price>50来筛选价格大于50的商品,或使用?aggregate=avg(price)来计算价格的平均值。

总之,URL参数提供了一种简单而有效的方式,通过在URL中附加参数,将额外的数据和指令传递给服务器,以便服务器可以根据这些参数进行相应的操作和返回结果。这样可以实现更灵活、可定制的API交互和数据操作。

获取URL参数

  • URL参数可以通过DefaultQuery()或Query()方法获取
  • DefaultQuery()若参数不村则,返回默认值,Query()若不存在,返回空串
  • API ? name=zs
package main

import (
    "fmt"
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/user", func(c *gin.Context) {
        //指定默认值
        //http://localhost:8080/user 才会打印出来默认的值
        name := c.DefaultQuery("name", "枯藤")
        c.String(http.StatusOK, fmt.Sprintf("hello %s", name))
    })
    r.Run()
}

输入http://localhost:8080/user 才会打印出来默认的值: image.png 而如果将URL更改为http://localhost:8080/user?name=binjie09,则返回的字符串将是"hello binjie09":

image.png 因为我们在URL中指定了name参数的值。

表单参数

先创建一个HTTP文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form action="http://localhost:8080/form" method="post" action="application/x-www-form-urlencoded">
    用户名:<input type="text" name="username" placeholder="请输入你的用户名">  <br>&nbsp;&nbsp;&nbsp;码:<input type="password" name="userpassword" placeholder="请输入你的密码">  <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

这个表单有两个字段:usernameuserpassword,分别用于输入用户名和密码。当用户点击提交按钮时,表单会将这些输入值作为表单数据发送到http://localhost:8080/form的URL。

你可以将以上的HTML代码保存为一个HTML文件,并在浏览器中打开它。然后,你就可以在浏览器中看到一个包含输入框和提交按钮的表单。当你填写表单并点击提交按钮时,表单数据将被发送到指定的URL,并且HTTP服务将返回对应的响应。

在goland上运行Http文件,即刻跳转到Web:

image.png

完成输入:

image.png
package main

//
import (
   "fmt"
   "net/http"

   "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   r.POST("/form", func(c *gin.Context) {
   
      types := c.DefaultPostForm("type", "post")// 获取名为"type"的表单字段,默认值为"post"
      username := c.PostForm("username")// 获取名为"username"的表单字段
      password := c.PostForm("userpassword")// 获取名为"userpassword"的表单字段
      
      // c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))
      // 返回包含用户名、密码和类型的字符串响应
      c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))
   })
   r.Run()
}

上传文件

试着上传一个文件:

package main

import (
   "fmt"
   "log"
   "net/http"

   "github.com/gin-gonic/gin"
)

func main() {
   r := gin.Default()
   r.POST("/upload", func(c *gin.Context) {
      _, headers, err := c.Request.FormFile("file")
      if err != nil {
         log.Printf("Error when try to get file: %v", err)
      }
      //headers.Size 获取文件大小
      if headers.Size > 1024*1024*2 {
         fmt.Println("文件太大了")
         return
      }
      //headers.Header.Get("Content-Type")获取上传文件的类型
      //如果上传的文件类型不是PNG,将打印"只允许上传png图片"并结束处理。
      if headers.Header.Get("Content-Type") != "image/png" {
         fmt.Println("只允许上传png图片")
         return
      }
      //这里假设创建了一个名为"video"的目录,并将上传的文件保存在其中。你可以根据自己的需求修改保存的目录。
      c.SaveUploadedFile(headers, "./video/"+headers.Filename)
      c.String(http.StatusOK, headers.Filename)
   })
   r.Run()
}

Http代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="file" >
    <input type="submit" value="提交">
</form>
</body>
</html>

该HTML表单使用POST方法将文件上传到http://localhost:8080/upload。具体解释如下:

  1. action="http://localhost:8080/upload":指定了表单提交的目标URL,即文件上传的目标地址。
  2. method="post":指定了表单使用POST方法提交。
  3. enctype="multipart/form-data":指定了表单数据的编码类型,用于支持文件上传。
  4. <input type="file" name="file">:创建了一个文件上传字段,用户可以通过点击"浏览"按钮来选择要上传的文件。
  5. <input type="submit" value="提交">:创建了一个提交按钮,用户点击后会将选定的文件上传到服务器。

你可以将这段HTML代码保存为一个HTML文件(例如index.html),然后在浏览器中打开该HTML文件。在浏览器中,你可以选择一个文件,然后点击"提交"按钮,该文件将被上传到http://localhost:8080/upload。请确保你已经运行了之前我给你的Go代码,以便能够成功处理文件上传请求。

上传对应的文件后:

image.png