介绍
- Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
- 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的
net/http足够简单,性能也非常不错 - 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范
在Go语言中,Gin是一个轻量级的Web框架,用于快速构建高性能的Web应用程序和API服务。Gin提供了简洁的API和丰富的功能,使得开发者可以快速搭建起一个稳定和高效的Web应用。
以下是Gin框架的一些主要特点和用途:
- 快速和高效:Gin采用了基于Radix树的路由实现,具备很高的路由匹配性能。通过减少内存分配和使用一些高效的设计,Gin能够处理大量的请求并保持低延迟。
- 简单易用:Gin提供了简洁且易于使用的API接口,使得开发者可以快速上手。它有清晰的文档和丰富的示例代码,为开发者提供了很好的参考和学习资源。
- 中间件支持:Gin支持使用中间件来处理请求的前置和后置逻辑。例如,可以使用日志中间件记录请求日志、使用身份验证中间件实现身份验证等。这样可以将业务逻辑和非业务逻辑分离,提高代码的可读性和可维护性。
- 路由组和参数绑定:Gin允许通过路由组来进行URL的嵌套和分组管理,提高了路由的可扩展性和组织性。Gin还提供了参数绑定功能,可以将请求参数自动绑定到结构体或变量上,简化了参数解析和校验的过程。
- 渲染和模板支持: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应用程序的基本流程。
运行结果:
API参数
API参数有什么用?
API参数在API开发中扮演着非常重要的角色,用于向API发送额外的数据或指令,以便服务器可以根据这些参数进行相应的操作和返回结果。以下是API参数的一些常见用途:
- 数据筛选和排序:通过参数,可以指定对数据进行筛选、排序或限制返回结果的方式。例如,可以使用
filter参数来筛选满足特定条件的数据,使用sort参数来对数据进行排序,使用limit和offset参数进行分页控制。 - 搜索和查询:API参数可以用于执行搜索操作,允许传递关键字、查询语句或其他搜索参数。服务器可以根据这些参数返回匹配的结果。例如,可以使用
q参数来进行全文搜索,使用category参数来指定特定类别的数据。 - 身份验证和授权:API参数可用于传递身份验证令牌或其他凭证信息,以进行身份验证和授权操作。服务器可以验证参数中的令牌,并根据用户的访问权限返回相应的结果。
- 自定义选项和配置:API参数可以用于传递自定义选项和配置信息,以定制化API的行为。例如,可以使用参数来启用/禁用特定功能,设置默认值或自定义行为。
- 过滤和聚合:通过参数,可以指定对数据进行过滤和聚合操作。例如,可以使用参数来指定时间范围、数值范围或其他条件,以获取特定的数据聚合结果。
- 地理位置和地图服务:API参数可用于指定地理位置坐标、搜索半径或其它地图相关参数,以便服务器返回相关的地理位置数据。
- 错误和异常处理:API参数也可以用于传递错误和异常信息。例如,使用特定的错误代码或标识符来指示特定类型的错误,或使用
debug参数来请求详细的错误堆栈跟踪信息。
API参数的具体用途取决于API的设计和业务需求。通过适当使用参数,可以实现更灵活、可定制的API交互和数据操作,提供更好的用户体验和功能扩展性。
API参数的获取
通过gin.Context的Param方法来获取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路由参数的值,并将它们分别保存在name和action变量中。
然后,使用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。
在终端运行后的结果:
URL参数
URL参数有什么用?
URL参数在API开发中有很多用途。以下是一些常见的用途:
- 过滤和排序:通过URL参数,可以向服务器发送过滤和排序的指令,以获取特定条件下的数据结果。例如,可以使用
?status=active来获取状态为激活的用户列表,或使用?sort=name&order=asc来按名称升序排列数据。 - 分页:使用URL参数来实现分页功能。可以通过
?page=2&limit=10来请求第2页,每页显示10条数据。 - 搜索:URL参数可以用于在服务器端执行搜索操作。例如,使用
?q=keyword来在用户列表中搜索包含关键字的用户。 - 身份验证和授权:可以将身份验证令牌(如Bearer Token)作为URL参数发送,用于对API进行身份验证和授权。例如,使用
?token=xxxxxx来发送访问令牌。 - 传递配置信息:可以使用URL参数向服务器传递配置信息或特定的操作指令。例如,使用
?debug=true来启用调试模式,或使用?format=json来指定返回结果的格式。 - 地理位置和地图服务:URL参数可用于指定地理位置坐标、搜索范围或地图视图等参数,以便服务器返回相关的地理位置数据。
- 数据筛选和聚合:通过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 才会打印出来默认的值:
而如果将URL更改为
http://localhost:8080/user?name=binjie09,则返回的字符串将是"hello binjie09":
因为我们在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>
密 码:<input type="password" name="userpassword" placeholder="请输入你的密码"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
这个表单有两个字段:username和userpassword,分别用于输入用户名和密码。当用户点击提交按钮时,表单会将这些输入值作为表单数据发送到http://localhost:8080/form的URL。
你可以将以上的HTML代码保存为一个HTML文件,并在浏览器中打开它。然后,你就可以在浏览器中看到一个包含输入框和提交按钮的表单。当你填写表单并点击提交按钮时,表单数据将被发送到指定的URL,并且HTTP服务将返回对应的响应。
在goland上运行Http文件,即刻跳转到Web:
完成输入:
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。具体解释如下:
action="http://localhost:8080/upload":指定了表单提交的目标URL,即文件上传的目标地址。method="post":指定了表单使用POST方法提交。enctype="multipart/form-data":指定了表单数据的编码类型,用于支持文件上传。<input type="file" name="file">:创建了一个文件上传字段,用户可以通过点击"浏览"按钮来选择要上传的文件。<input type="submit" value="提交">:创建了一个提交按钮,用户点击后会将选定的文件上传到服务器。
你可以将这段HTML代码保存为一个HTML文件(例如index.html),然后在浏览器中打开该HTML文件。在浏览器中,你可以选择一个文件,然后点击"提交"按钮,该文件将被上传到http://localhost:8080/upload。请确保你已经运行了之前我给你的Go代码,以便能够成功处理文件上传请求。
上传对应的文件后: