go的web框架Gin学习(一)

gin的github.com地址https://github.com/gin-gonic/gin

首先下载依赖

go get -u -v github.com/gin-gonic/gin

使用场景

<1>GET请求,无参数

package main

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

func main() {
  r := gin.Default()  // 初始化
  r.GET("/ping",func(c *gin.Context) {
      // 返回JSON数据
      c.JSON(http.StatusOK,gin.H{
          "code":200,
          "message":"pong",  // 某尾有逗号
      })
      // 返回字符串
      // c.String(http.StatusOK,"pong")
  })
  // 启动并监听8046端口
  r.Run(":8046")
}

验证:

 <2>GET请求,多级路径

package main

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

func main() {
  r := gin.Default()  // 初始化
  r.GET("/hello/:name",func(c *gin.Context) {
      // 获取变量值
      name := c.Param("name")
      // 返回字符串
      c.String(http.StatusOK,"hello %s",name)
  })
  // 启动并监听8046端口
  r.Run(":8046")
}

验证:

<3>GET请求,带参数

package main

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

func main() {
  r := gin.Default()  // 初始化
  r.GET("/query",func(c *gin.Context) {
      // 获取变量值,设置默认值为hello
      firstname := c.DefaultQuery("firstname","hello")
      lastname := c.Query("lastname")
      // 返回字符串
      c.String(http.StatusOK,"%s %s",firstname,lastname)
  })
  // 启动并监听8046端口
  r.Run(":8046")
}

 验证:

 <4>POST请求,表单形式

package main

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

func main() {
  r := gin.Default()  // 初始化
  r.POST("/data",func(c *gin.Context) {
      // 获取变量值,设置默认值为200
      code := c.DefaultPostForm("code","200")
      message := c.PostForm("message")
      // 返回json数据
      c.JSON(http.StatusOK, gin.H{
			"message": message,
			"code":    code,
	  })
  })
  // 启动并监听8046端口
  r.Run(":8046")
}

验证:

 <5>POST请求,解析body数据

package main

import (
	"fmt"
	"net/http" // 使用包中的状态信息
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin
	r := gin.Default()
	r.POST("/body",func(c *gin.Context) {
        // 初始化一个map用于接收body的json数据
		json := make(map[string]interface{})
        // 绑定
		err := c.BindJSON(&json)
		if err != nil {
			fmt.Println(err)
		}
		c.String(http.StatusOK,"the name is %s,age is %s",json["name"],json["age"])
	})
	r.Run(":8046")
}

验证:

<6>POST请求,单个文件上传

package main

import (
	"net/http" // 使用包中的状态信息
	"github.com/gin-gonic/gin"
)

func main() {
	    // 初始化gin
	    r := gin.Default()
        r.POST("/upload", func(c *gin.Context) {
        // 获取file名称的文件
		file, _ := c.FormFile("file")
        // 保存到服务端本地
		c.SaveUploadedFile(file, file.Filename)
		// c.String(http.StatusOK,"%s %d",file.Filename,file.Size)
        // 返回文件名及其大小
		c.JSON(http.StatusOK, gin.H{
			"code":     200,
			"filename": file.Filename,
			"size":     file.Size,
		})
	})
	r.Run(":8046")
}

验证:

<7>POST请求,多个文件批量上传

package main

import (
	"net/http" // 使用包中的状态信息
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin
	r := gin.Default()
    r.POST("/multupload", func(c *gin.Context) {
		type f struct {
			// 注意变量首字母大写
			Name string `json:"name"`
			Size int    `json:"size"`
		}
        // 切片用于保存上传的文件信息
		t := make([]f, 0)
		form, _ := c.MultipartForm()
		files := form.File["upload[]"]
		for _, file := range files {
			err := c.SaveUploadedFile(file, file.Filename)
			if err != nil {
				fmt.Println("文件保存失败")
			}
			a := f{Name: file.Filename, Size: int(file.Size)}
			t = append(t, a)
		}
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": t,
		})
	})
	r.Run(":8046")
}

验证:

<8>GET请求,下载文件

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http" // 使用包中的状态信息
	"os"
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin
	r := gin.Default()
    // 下载文件
	r.GET("/download", func(c *gin.Context) {
		// 本地文件
		imgPath := "test.jpg"
		// 获取图片大小,单位字节
		f, _ := os.Stat(imgPath)
		size := f.Size()
		// 读取图片
		context, _ := ioutil.ReadFile(imgPath)
		reader := bytes.NewBuffer(context)
        // 设置响应类型,图片
		contentType := "image/jepg"
		// 额外的头部信息
		extraHeader := map[string]string{
			"Content-Disposition": `attachment; filename="test.jpg"`,
		}
		c.DataFromReader(http.StatusOK, size, contentType, reader, extraHeader)
	})
	r.Run(":8046")
}

验证:

<9>GET请求,cookie处理

package main

import (
	"fmt"
	"net/http" // 使用包中的状态信息
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin
	r := gin.Default()
    // cookies
	r.GET("/cookie", func(c *gin.Context) {
		cookie, err := c.Cookie("user_cookie")
		// 如果cookie不存在
		if err != nil {
			fmt.Println("cookie不存在,重新设置")
			cookie = "20220729"
			// 响应返回set-cookie头部
			c.SetCookie("user_cookie", "test", 3600, "/", "localhost", false, true)
		}
		fmt.Print(cookie)
		c.JSON(http.StatusOK, gin.H{
			"code": 200,
		})
	})
	r.Run(":8046")
}

验证:

<10>GET请求,重定向处理

package main

import (
	"fmt"
	"net/http" // 使用包中的状态信息
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "pong",
		})
	})
	// 重定向到外部
	r.GET("/test", func(c *gin.Context) {
		// 301,永久重定向到百度
		c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
	})
	// 重定向内部路由-->ping
	r.GET("/test1", func(c *gin.Context) {
		c.Request.URL.Path = "/ping"
		r.HandleContext(c)
	})
	r.Run(":8046")
}

验证:

​​​​​​​

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值