Go Web—gin框架

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")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值