基本路由
gin框架中采用的路由库是基于httprouter做的(?)
地址:https://github.com/julienschmidt/httprouter
参数
API参数
可以通过Context的Param方法来获取API参数
package mainimport (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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("fmt""net/http""github.com/gin-goinc/gin")func main() {r := gin.Default()// 限制表单上传大小8M,默认为32Mr.MaxMultipartMemory = 8 << 20r.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 mainimport ("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))}
