Golang中Gin框架的基础知识学习

目录

1.安装

2.基本的架构

    2.1  直接调用方案

    2.2  函数方案

3.HTTP服务器

     3.1  GET参数获取

     3.2  POST参数获取

     3.3  JSON参数获取

     3.4  提交表单获取参数

     3.5  文件上传

     3.6  响应输出

 3.7  嵌套HTML视图

           3.7.1  HTML简单输出

           live.html

          3.7.2  文件的路由定义

         3.7.3  重定向

         3.7.4  全局中间件

         3.7.5  分组中间件

         3.7.6  设置群组


 

 

1.安装

go get gopkg.in/gin-gonic/gin.v1

2.基本的架构

    2.1  直接调用方案

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		name := c.Query("name")
		c.String(http.StatusOK, "Hello %s", name)
	})
 
	//默认监听8080
	r.Run(":80")
 
}

    2.2  函数方案

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func pings(c *gin.Context) {
	name := c.Query("name")
	c.String(http.StatusOK, "Hello %s", name)
}
 
func main() {
	r := gin.Default()
	r.GET("/ping", pings)
	//默认监听8080
	r.Run(":80")
 
}

3.HTTP服务器

     3.1  GET参数获取

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func getinfos(c *gin.Context) {
	//获取name
	name := c.Query("name")
	//DefaultQuery 第一个是获取值 第二个参数是默认值
	lastname := c.DefaultQuery("lastname", "这是默认值")
	c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
 
func main() {
	r := gin.Default()
	r.GET("/ping", getinfos)
	//默认监听8080
	r.Run(":80")
}

     3.2  POST参数获取

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func postinfos(c *gin.Context) {
	//获取name
	name := c.PostForm("name")
	//DefaultPostForm 第一个是获取值 第二个参数是默认值
	lastname := c.DefaultPostForm("lastname", "这是默认值")
	c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
 
func main() {
	r := gin.Default()
	r.POST("/postinfos", postinfos)
	//默认监听8080
	r.Run(":80")
}

     3.3  JSON参数获取

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
type Login struct {
	Name     string `json:"name"`
	Password string `json:"password"`
}
 
func loginJSON(c *gin.Context) {
	json := Login{}
	//获取json数据后并解析
	if c.BindJSON(&json) == nil {
		if json.Name == "root" && json.Password == "root" {
			c.JSON(http.StatusOK, gin.H{"status": "登陆成功"})
		} else {
			c.JSON(http.StatusUnauthorized, gin.H{"status": "账号或者密码错误"})
		}
	}
}
func main() {
	r := gin.Default()
	// 绑定JSON的例子 ({"name": "manu", "password": "123"})
	r.POST("/loginJSON", loginJSON)
	//默认监听8080
	r.Run(":80")
}

     3.4  提交表单获取参数

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
type Login struct {
	Name     string `form:"name"`
	Password string `form:"password"`
}
 
func loginFORM(c *gin.Context) {
	form := Login{}
	//获取form数据后并解析
	if c.Bind(&form) == nil {
		if form.Name == "root" && form.Password == "root" {
			c.JSON(200, gin.H{"status": "登陆成功"})
		} else {
			c.JSON(203, gin.H{"status": "账号或者密码错误"})
		}
	}
}
 
func main() {
	r := gin.Default()
	r.POST("/loginFORM", loginFORM)
	//默认监听8080
	r.Run(":80")
}

     3.5  文件上传

package main
 
import (
	"github.com/gin-gonic/gin"
	"os"
	"log"
	"io"
	"time"
	"strconv"
)
 
//上传文件
func file(c *gin.Context) {
	//上传文件名称
	file, header, err := c.Request.FormFile("upload")
	if err != nil {
		c.JSON(200, gin.H{"msg": "文件不得为空"})
		return
	}
	filename := time.Now().Unix()
	//创建文件
	out, err := os.Create("./public/"+strconv.FormatInt(filename, 10) + ".png")
	if err != nil {
		log.Fatal(err)
	}
	defer out.Close()
	//复制流文件
	_, err = io.Copy(out, file)
	if err != nil {
		log.Fatal(err)
	}
	c.JSON(200, gin.H{"msg": "文件" + header.Filename + "已经上传完成,新名字为:" + strconv.FormatInt(filename, 10)})
}
 
func main() {
	r := gin.Default()
	r.POST("/file", file)
	//默认监听8080
	r.Run(":80")
}

     3.6  响应输出

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
type msg struct {
	Name    string
	Message string
	Number  int
}
 
func moreJSON(c *gin.Context) {
	msg := msg{}
	msg.Name = "Lena"
	msg.Message = "hey"
	msg.Number = 123
	// 以下方式都会输出 :   {"name": "Lena", "Message": "hey", "Number": 123}
	c.JSON(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
	c.XML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
	c.YAML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
	//输出的结构体
	c.JSON(200, msg)
	c.XML(200, msg)
	c.YAML(200, msg)
}
 
func main() {
	r := gin.Default()
	r.GET("/moreJSON", moreJSON)
	//默认监听8080
	r.Run(":80")
}

 3.7  嵌套HTML视图

           3.7.1  HTML简单输出

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
func index(c *gin.Context) {
	//根据完整文件名渲染模板,并传递参数
	c.HTML(200, "live.html", gin.H{
		"title": "你就是个二大傻子",
	})
}
 
func main() {
	r := gin.Default()
	//加载模板
	r.LoadHTMLGlob("templates/*")
	//定义路由
	r.GET("/index", index)
	r.Run(":80")
}

           live.html




    
    live


11111111111111111

{{.title}}

          3.7.2  文件的路由定义

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func main() {
	r := gin.Default()
	//定义多文件的路径,使用的是系统的路径(绝对,相对地址都可以)
	r.Static("/a", "D:/phpStudy/WWW/go/templates")
	r.Static("/b", "./templates")
	r.StaticFS("/c",http.Dir("./templates"))
	r.StaticFS("/d",http.Dir("D:/phpStudy/WWW/go/templates"))
 
	//定义单个文件的路径,使用的是绝对路径
	r.StaticFile("/e","./templates/live.html")
	r.Run(":80")
}

         3.7.3  重定向

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
func redirect_abroad(c *gin.Context) {
	//支持外部的重定向
	c.Redirect(301, "http://www.baidu.com/")
}
 
func redirect_within(c *gin.Context) {
	//支持内部的重定向
	c.Redirect(301, "/home")
}
 
func index(c *gin.Context) {
	c.String(200, "hello world")
}
 
func home(c *gin.Context) {
	c.String(200, "hello home")
}
 
func main() {
	r := gin.Default()
	r.GET("/abroad", redirect_abroad)
	r.GET("/within", redirect_within)
 
	r.GET("/index", index)
	r.GET("/home", home)
	r.Run(":80")
}

         3.7.4  全局中间件

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
func index(c *gin.Context) {
	c.String(200, "日你大爷的")
}
 
//中间件的定义
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		name := c.Query("name")
		password := c.Query("password")
		if name == "admin" && password == "111111" {
			c.String(200, "验证通过
") //请求前 //前置操作 c.Next() //处理请求(只能在中间件中使用) //请求后 //后置操作 c.String(200, "中间件过了
") } else { //数据挂起,打断 c.Abort() c.String(200, "我是中间件,你没有权限") } } } func main() { r := gin.Default() //设置全局中间件 r.Use(Logger()) r.GET("/index", index) r.Run(":80") }

         3.7.5  分组中间件

package main
 
import (
	"github.com/gin-gonic/gin"
)
 
//中间件的定义
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		name := c.Query("name")
		password := c.Query("password")
		if name == "admin" && password == "111111" {
			c.String(200, "验证通过
") //请求前 //前置操作 } else { //数据挂起,打断 c.Abort() c.String(200, "我是中间件,你没有权限") } } } func index(c *gin.Context) { c.String(200, "日你大爷的") } func home(c *gin.Context) { c.String(200, "hello home") } func login(c *gin.Context) { c.String(200, "请先登陆!") } func main() { r := gin.Default() //设置分组中间件 s := r.Group("/index", Logger()) { s.GET("/index", index) s.GET("/home", home) } r.GET("/login", login) r.Run(":80") }

         3.7.6  设置群组

package main
 
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func get1(c *gin.Context) {
	c.String(http.StatusOK, "Hello get1")
}
 
func get2(c *gin.Context) {
	c.String(http.StatusOK, "Hello get2")
}
 
func main() {
	r := gin.Default()
	//设置分组
	s := r.Group("/getinfo")
	{
		s.GET("/get1", get1)
		s.GET("/get2", get2)
	}
	//默认监听8080
	r.Run(":80")
}

转载自:https://blog.csdn.net/feiwutudou/article/details/81188146

另外一篇优秀文章:https://www.jianshu.com/p/ebd73ffe31e8

你可能感兴趣的:(GO)