思考并回答以下问题:
基本路由
- gin框架中采用的路由库是基于httprouter做的
- 地址为:https://github.com/julienschmidt/httprouter
1 | package main |
Restful风格的API
- gin支持Restful风格的API
- 即Representational State Transfer的缩写。直接翻译的意思是”表现层状态转化”,是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作
1,获取文章/blog/getXxx Get blog/Xxx
2,添加/blog/addXxx POST blog/Xxx
3,修改/blog/updateXxx PUT blog/Xxx
4,删除/blog/delXxxx DELETE blog/Xxx
API参数
- 可以通过Context的Param方法来获取API参数
- localhost:8000/xxx/zhangsan
1 | package main |
输出结果:
URL参数
- URL参数可以通过DefaultQuery()或Query()方法获取
- DefaultQuery()若参数不村则,返回默认值,Query()若不存在,返回空串
- API ? name=zs
1 | package main |
不传递参数输出的结果
传递参数输出的结果:
表单参数
- 表单传输为post请求,http常见的传输格式为四种:
- application/json
- application/x-www-form-urlencoded
- application/xml
- multipart/form-data
- 表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数
1 |
|
1 | package main |
输出结果:
上传单个文件
- multipart/form-data格式用于文件上传
- gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中
1 |
|
1 | package main |
效果演示:
上传特定文件
有的用户上传文件需要限制上传文件的类型以及上传文件的大小,但是gin框架暂时没有这些函数(也有可能是我没找到),因此基于原生的函数写法自己写了一个可以限制大小以及文件类型的上传函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32package 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")获取上传文件的类型
if headers.Header.Get("Content-Type") != "image/png" {
fmt.Println("只允许上传png图片")
return
}
c.SaveUploadedFile(headers, "./video/"+headers.Filename)
c.String(http.StatusOK, headers.Filename)
})
r.Run()
}
上传多个文件
1 |
|
1 | package main |
效果演示:
routes group
- routes group是为了管理一些相同的URL
1 | package main |
效果演示:
路由原理
httproter会将所有路由规则构造一颗前缀树
关于GIN的路由树