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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>live</title>
</head>
<body>
<h1>11111111111111111</h1>
<h1>{{.title}}</h1>
</body>
</html>

          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, "验证通过</br>")
			//请求前
			//前置操作
			c.Next() //处理请求(只能在中间件中使用)
			//请求后
			//后置操作
			c.String(200, "中间件过了</br>")
		} 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, "验证通过</br>")
			//请求前
			//前置操作
		} 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值