1. Hello, World!
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type HelloController struct {}
func (controller *HelloController) Hello (ctx *gin.Context) {
ctx.String(http.StatusOK, "Hello, World!")
}
func main() {
controller := &HelloController{}
router := gin.Default()
router.GET("/", controller.Hello)
router.Run("127.0.0.1:8888")
}
2. 查询参数
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
type HelloController struct {}
func (controller *HelloController) Hello (ctx *gin.Context) {
name := ctx.DefaultQuery("name", "World")
ctx.String(http.StatusOK, fmt.Sprintf("Hello, %s!", name))
}
func main() {
controller := &HelloController{}
router := gin.Default()
router.GET("/", controller.Hello)
router.Run("127.0.0.1:8888")
}
例如,http://127.0.0.1:8888/?name=Jack
3. 绑定表单
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"net/http"
)
type User struct {
UserName string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
BirthDay string `form:"birth_day"`
}
type UserController struct {}
func (controller *UserController) Register(ctx *gin.Context) {
var user User
err := ctx.ShouldBindWith(&user, binding.Form)
if err != nil {
fmt.Println(err)
ctx.String(http.StatusBadRequest, "Please fill the form!")
return
}
ctx.JSON(http.StatusOK, gin.H {
"username": user.UserName,
"password": user.Password,
"birth_day": user.BirthDay,
})
}
func main() {
controller := &UserController{}
router := gin.Default()
router.POST("/user/register", controller.Register)
router.Run("127.0.0.1:8888")
}
4. 绑定JSON
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"net/http"
)
type User struct {
UserName string `json:"username" form:"username" binding:"required"`
Password string `json:"password" form:"password" binding:"required"`
BirthDay string `json:"birth_day" form:"birth_day"`
}
type UserController struct {}
func (controller *UserController) Register(ctx *gin.Context) {
var user User
err := ctx.ShouldBindWith(&user, binding.JSON)
if err != nil {
fmt.Println(err)
ctx.String(http.StatusBadRequest, "Please fill the form!")
return
}
ctx.JSON(http.StatusOK, gin.H {
"username": user.UserName,
"password": user.Password,
"birth_day": user.BirthDay,
})
}
func main() {
controller := &UserController{}
router := gin.Default()
router.POST("/user/register", controller.Register)
router.Run("127.0.0.1:8888")
}
或直接使用 err := ctx.ShouldBindJSON(&user)
。
5. 路由分组
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type UserController struct {}
type BookController struct {}
func (controller *UserController) GetInfo(ctx *gin.Context) {
ctx.String(http.StatusOK, "My name is Jack.")
}
func (controller *BookController) GetInfo(ctx *gin.Context) {
ctx.String(http.StatusOK, "This book is for the beginners.")
}
func main() {
userController := &UserController{}
bookController := &BookController{}
router := gin.Default()
userGroup := router.Group("/user")
bookGroup := router.Group("/book")
userGroup.GET("/info", userController.GetInfo)
bookGroup.GET("/info", bookController.GetInfo)
router.Run("127.0.0.1:8888")
}
例如,http://127.0.0.1:8888/book/info。
6. 中间件
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func AuthMiddleWare(ctx *gin.Context) {
if cookie, err := ctx.Request.Cookie("session_id"); err == nil {
if cookie.Value == "123" {
ctx.Next()
return
}
}
ctx.JSON(http.StatusUnauthorized, gin.H {
"error": "Unauthorized",
})
ctx.Abort()
return
}
作用于单个请求处理器:
router := gin.Default()
router.GET("/", AuthMiddleWare, func(ctx *gin.Context) {
ctx.String(http.StatusOK, "Hello, World!")
})
作用于路由分组:
router := gin.Default()
userGroup := router.Group("/user", AuthMiddleWare)
userGroup.GET("/info", userController.GetInfo)
或:
router := gin.Default()
bookGroup := router.Group("/book")
bookGroup.Use(AuthMiddleWare)
作用于全局:
router := gin.Default()
router.Use(AuthMiddleWare)
7. 上传文件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"io"
"net/http"
"os"
)
func main() {
router := gin.Default()
router.POST("/upload", func(ctx *gin.Context) {
file, header, err := ctx.Request.FormFile("file")
if err != nil {
ctx.String(http.StatusBadRequest, "Input a file.")
return
}
localFile, err := os.Create(header.Filename)
if err != nil {
fmt.Println(err)
ctx.String(http.StatusInternalServerError, "Error.")
return
}
defer localFile.Close()
_, err = io.Copy(localFile, file)
if err != nil {
fmt.Println(err)
ctx.String(http.StatusInternalServerError, "Error.")
return
}
ctx.String(http.StatusOK, "Successfully.")
})
router.Run("127.0.0.1:8888")
}
8. 下载文件
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/download", func(ctx *gin.Context) {
filename := "main.py"
ctx.Header("Content-Type", "application/octet-stream")
ctx.Header("Content-Disposition", "attachment; filename="+filename)
ctx.Header("Content-Transfer-Encoding", "binary")
ctx.File(filename)
})
router.Run("127.0.0.1:8888")
}