基本路由
gin框架中采用的路由库是基于httprouter做的(?)
地址:https://github.com/julienschmidt/httprouter
参数
API参数
可以通过Context的Param方法来获取API参数
package main
import (
r := gin.Default()
r.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
// 截取
action = string.Trim(action, "/")
c.String(name + " is " + action)
})
r.Run()
)
URL参数
URL参数可以通过DefaultQuery()或Query()方法获取
DefaultQuery():若参数不存在则返回默认值
Query():若参数不存在则返回空串
package main
import (
"fmt"
"github.com/gin-goinc/gin
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
// 指定默认值
name := c.DefaultQuery("name", "大大神")
c.String(fmt.Sprintf("hello %s", name))
})
r.Run()
}
表单参数
表单传输为post请求,常见有四种
- application/json
- application/x-www-form-urlencoded
- application/xml
- multipart/form-data
表单参数可以通过DefaultPostForm()或PostForm()方法获取,该方法默认解析x-www-form-urlencoded或form-data格式的参数。
DefaultPostForm():若参数不存在则返回默认值
PostForm():若参数不存在则返回空串
package main
import (
"fmt"
"github.com/gin-goinc/gin
)
func main() {
r := gin.Default()
r.POST("/form", func(c *gin.Context) {
types := c.DefaultPostForm("type", "post")
username := c.PostForm("username")
password := c.PostForm("password")
c.String(fmt.Sprintf("username: %s, password: %s, type: %s", username, password, type))
})
r.Run()
}
上传单个文件
multipart/form-data格式用于文件上传
gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中
package main
import (
"github.com/gin-goinc/gin"
)
func main() {
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
file, err := r.FormFile("file")
if err != nil {
c.String(500, "上传文件出错")
}
c.SaveUploadedFile(file, file.Filename)
c.String(file.Filename)
})
r.Run()
}
上传多个文件
package main
import (
"fmt"
"net/http"
"github.com/gin-goinc/gin"
)
func main() {
r := gin.Default()
// 限制表单上传大小8M,默认为32M
r.MaxMultipartMemory = 8 << 20
r.POST("/upload", func(c *gin.Context) {
files, err := r.FormFile("files")
if err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("get error %s", err.Error()))
}
// 遍历所有图片
for _, file := range files {
if err := c.SaveUploadedFile(file, file.Filename); err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("upload err %s", err.Error()))
return
}
}
c.String(http.StatusOK, fmt.Sprintf("uploaded %d files", len(files)))
})
r.Run()
}
路由组
routes group是为了管理一些相同的url
package main
import (
"fmt"
"github.com/gin-goinc/gin"
)
func main() {
r := gin.Default()
v1 := r.Group("/v1")
{
v1.GET("/login", login)
}
v2 := r.Group("/v2")
{
v2.POST("/login", login)
v2.POST("/submit", submit)
}
r.Run()
}
func login(c *gin.Context) {
name := DefaultQuery("name", "Unknown")
c.String(200, fmt.Sprintf("hello %s", name))
}
func submit() {
name := c.DefaultPostForm("name", "Batman")
c.String(201, fmt.Spintf("hello %s", name))
}