不积跬步,无以至千里

Golang之gin


换了新公司,换了新电脑,换了新的编程语言,开始另一阶段的学习。

安装

在使用gin之前,需要在本地配置gin的开发环境

gin官方文档

安装:go get github.com/gin-gonic/gin

使用

gin是go语言下的web开发框架,通过一个小demo先熟悉下使用方法

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"github.log"
	"os"
	"io"
)

func main() {
	router := gin.Default()
	router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello world") })
	router.GET("/user/:name", func(context *gin.Context) {
		name := context.Param("name")
		context.String(http.StatusOK, "Hello %s", name)
	})
	//?*标示含义
	router.GET("/user/:name/*param", func(context *gin.Context) {
		param := context.Param("param")
		name := context.Param("name")
		context.String(http.StatusOK, "hello,%s %s", name, param)
	})
	//《---以上是请求路径的路由转发
	router.GET("/user", func(context *gin.Context) {
		firstname := context.DefaultQuery("firstname", "default")
		lastname := context.Query("lastname")
		context.String(http.StatusOK, "hello $s $s", firstname, lastname)
	})
	//《---从get请求中获取请求参数
	router.POST("/user/post", func(context *gin.Context) {
		message := context.PostForm("message")
		nick := context.DefaultPostForm("nick", "default")
		context.JSON(http.StatusOK, gin.H{
			"status_code": http.StatusOK,
			"status":      "ok",
			"message":     message,
			"nick":        nick,
		})
	})
	////《---获取Post请求内容,并返回json结果
	router.LoadHTMLGlob("templates/*")
	router.GET("uploadFile", func(context *gin.Context) {
		context.HTML(http.StatusOK, "upload.html", gin.H{})
	})
	router.POST("/upload", func(context *gin.Context) {
		log.Info("upload--")
		file, header, err := context.Request.FormFile("upload")
		if err != nil {
			context.String(http.StatusBadRequest, "Bad request")
			return
		}
		filename := header.Filename
		out, err := os.Create(filename)
		if err != nil {
			log.Fatal("error", err)
		}
		defer out.Close()
		_, err = io.Copy(out, file)
		if err != nil {
			log.Fatal(err)
		}
		context.String(http.StatusCreated, "upload success")
	})
	//《---文件上传和gtml页面展示

	//分组路由(请求路径/v1/login)
	v1 := router.Group("/v1")
	v1.GET("/login", func(context *gin.Context) {
		context.String(http.StatusOK, "v1 login")
	})

	router.Run(":8000")

}

前端参数解析

Get请求 Bind Query Post请求 Bind

Bind Get请求会使用Form

func Default(method, contentType string) Binding {
	if method == "GET" {
		return Form
	}
	switch contentType {
	case MIMEJSON:
		return JSON
	case MIMEXML, MIMEXML2:
		return XML
	case MIMEPROTOBUF:
		return ProtoBuf
	case MIMEMSGPACK, MIMEMSGPACK2:
		return MsgPack
	default: //case MIMEPOSTForm, MIMEMultipartPOSTForm:
		return Form
	}
}

Post请求会根据content-type的不同来使用不同的绑定方式