Go学习笔记二——windows下使用Gin

Gin 是一个用 Go (Golang) 编写的 web 框架

它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json

go的版本

配置环境变量

set GO111MODULE=on
set GOPROXY=https://goproxy.io

初始化

go mod init  demo

获取Gin

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

1.简单例子

入口文件main.go

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

运行

go run main.go

浏览器访问http://localhost:8080/test

返回

{"message":"hello"}

Gin是一个轻量级的 WEB 框架

  支持 RestFull 风格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上传,分组路由,Multipart/Urlencoded FORM,支持 JsonP,参数处理

2.修改启动方式

默认启动方式,包含 Logger、Recovery 中间件

r := gin.Default()

请求接口会输出日志

无中间件启动

r := gin.New()

 请求接口不再输出日志

3.日志写入文件

package main

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

func main() {

    gin.DisableConsoleColor()

    // 创建记录日志的文件
    f, _ := os.Create("gin.log")
    gin.DefaultWriter = io.MultiWriter(f)
    // 如果需要将日志同时写入文件和控制台,请使用以下代码
    // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
    r := gin.Default()

    r.GET("/test", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

启动

以前输出的都写入和main.go在同一目录下的gin.log中

4.静态资源

  StaticFile 是加载单个文件

  StaticFS 是加载一个完整的目录资源

package main

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

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.StaticFile("/favicon.ico", "./favicon.ico")
    r.Run() // listen and serve on 0.0.0.0:8080
}

5.上传文件

  单文件

package main

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

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })
    r.POST("/upload", func(c *gin.Context) {
        // 单文件
        file, _ := c.FormFile("file")
        log.Println(file.Filename)
        dst := path.Join("./static/upload", file.Filename)
        // 上传文件至指定目录
        c.SaveUploadedFile(file, dst)
        c.JSON(200, gin.H{
            "message": file.Filename+" uploaded!",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

测试

  多文件

package main

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

func main() {
    r := gin.Default()
    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))
    r.GET("/test", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })

    r.POST("/upload", func(c *gin.Context) {
        // 多文件
        form, _ := c.MultipartForm()
        files := form.File["files[]"]

        for _, file := range files {
            log.Println(file.Filename)
            dst := path.Join("./static/upload", file.Filename)
            // 上传文件至指定目录
            c.SaveUploadedFile(file, dst)
        }

        c.JSON(200, gin.H{
            "message":  strconv.Itoa(len(files))+" uploaded!",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

测试

6.获取参数

(1)获取路径中的参数

package main

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

func main() {

    r := gin.Default()

    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))

    r.GET("/test/:firstname/:lastname", func(c *gin.Context) {
        firstname := c.Param("firstname")
        lastname := c.Param("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

测试

(2)获取GET参数

c.Query 解析?后的参数,eg: key1=value2&key2=value2

c.DefaultQuery 处理默认参数

package main

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

func main() {

    r := gin.Default()

    r.GET("/test", func(c *gin.Context) {
        firstname := c.DefaultQuery("firstname", "Guest")
        lastname := c.Query("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

测试

(3)获取post参数

c.PostFROM 解析的是  x-www-form-urlencoded 或 from-data 的参数

c.DefaultPostForm 处理默认参数

package main

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

func main() {

    r := gin.Default()

    r.StaticFS("/public", http.Dir("E:/go_projects/demo/static"))

    r.POST("/test", func(c *gin.Context) {
        firstname := c.DefaultPostForm("firstname", "Guest")
        lastname :=  c.PostForm("lastname")
        c.JSON(http.StatusOK, gin.H{
            "message": "hello",
            "firstname":firstname,
            "lastname":lastname,
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

测试

 

posted @ 2020-07-12 22:35  慕尘  阅读(1355)  评论(0编辑  收藏  举报