[go]gin框架

gin参考

Gin框架返回值

// 返回json

func main() {
    r := gin.Default()

    //方法一: 自己拼接json
    // gin.H is a shortcut for map[string]interface{}
    r.GET("/someJSON", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
    })

    //方法2: 返回结构体对象
    r.GET("/moreJSON", func(c *gin.Context) { // You also can use a struct
        var msg struct {
            Name    string `json:"user"`
            Message string
            Number  int
        }
        msg.Name = "Lena"
        msg.Message = "hey"
        msg.Number = 123

        // Note that msg.Name becomes "user" in the JSON
        c.JSON(http.StatusOK, msg)
    })

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}
// 渲染html

router.LoadHTMLGlob("templates/*")
router.Static("/static", "./static") 

func main() {
    router := gin.Default()

    router.LoadHTMLGlob("templates/*")
    router.Static("/static", "./static") //第二个参数相对于执行路径

    //渲染静态目录
    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)
    })
    router.Run(":8000")
}

Gin框架参数传递

//获取参数 querystring

/user/search?name=mm&age=22

r.GET("/user/search", func(c *gin.Context)
name := c.DefaultQuery("name", "mm") // 赋默认值
name := c.Query("name")

func main() {
    r := gin.Default()
    r.GET("/user/search", func(c *gin.Context) {
        name := c.DefaultQuery("name", "mm")
        //name := c.Query("name")
        age := c.Query("age")

        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message":  "pong",
            "name": name,
            "age":  age,
        })
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
// 获取参数 path

/user/search/mm/22
r.GET("/user/search/:name/:age", func(c *gin.Context) 

name := c.Param("mm")

func main() {
    r := gin.Default()
    r.GET("/user/search/:name/:age", func(c *gin.Context) {
        name := c.Param("mm")
        age := c.Param("age")

        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message":  "pong",
            "username": username,
            "address":  address,
        })
    })

    r.Run(":8080") // listen and serve on 0.0.0.0:8080
}
// 获取参数: form提交

r.POST("/user/search", func(c *gin.Context) {
name := c.DefaultPostForm("name", "mm")
name := c.PostForm("name")

func main() {
    r := gin.Default()
    r.POST("/user/search", func(c *gin.Context) {
        //name := c.DefaultPostForm("name", "mm")
        name := c.PostForm("name")
        age := c.PostForm("age")
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message":  "pong",
            "name": name,
            "age":  age,
        })
    })

    r.Run(":8080")
}

// Binding from JSON
type Login struct {
    User     string `form:"user" json:"user" binding:"required"`
    Password string `form:"password" json:"password" binding:"required"`
}

func main() {
    router := gin.Default()

    // Example for binding JSON ({"user": "manu", "password": "123"})
    router.POST("/loginJSON", func(c *gin.Context) {
        var login Login

        if err := c.ShouldBindJSON(&login); err == nil {
            fmt.Printf("login info:%#v\n", login)
            c.JSON(http.StatusOK, gin.H{
                "user":     login.User,
                "password": login.Password,
            })
        } else {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
    })

    // Example for binding a HTML form (user=manu&password=123)
    router.POST("/loginForm", func(c *gin.Context) {
        var login Login
        // This will infer what binder to use depending on the content-type header.
        if err := c.ShouldBind(&login); err == nil {
            c.JSON(http.StatusOK, gin.H{
                "user":     login.User,
                "password": login.Password,
            })
        } else {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
    })

    // Example for binding a HTML querystring (user=manu&password=123)
    router.GET("/loginForm", func(c *gin.Context) {
        var login Login
        // This will infer what binder to use depending on the content-type header.
        if err := c.ShouldBind(&login); err == nil {
            c.JSON(http.StatusOK, gin.H{
                "user":     login.User,
                "password": login.Password,
            })
        } else {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
    })

    // Listen and serve on 0.0.0.0:8080
    router.Run(":8080")
}

gin Restful

// restful风格

func main() {
    //Default返回一个默认的路由引擎
    r := gin.Default()
    r.GET("/user/info", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "get user info succ",
        })
    })
    r.POST("/user/info", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "create user info succ",
        })
    })
    r.PUT("/user/info", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "update user info succ",
        })
    })
    r.DELETE("/user/info", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "delete user info succ ",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
// 版本管理

func login(ctx *gin.Context) {
    ctx.JSON(200, gin.H{
        "message": "success",
    })
}

func read(ctx *gin.Context) {
    ctx.JSON(200, gin.H{
        "message": "success",
    })
}

func submit(ctx *gin.Context) {
    ctx.JSON(200, gin.H{
        "message": "success",
    })
}

func main() {
    //Default返回一个默认的路由引擎
    router := gin.Default()

    // Simple group: v1
    //   /v1/login
    //   /v1/submit
    //   /v1/read
    v1 := router.Group("/v1")
    {
        v1.POST("/login", login)
        v1.POST("/submit", submit)
        v1.POST("/read", read)
    }

    // Simple group: v2
    //   /v2/login
    //   /v2/submit
    //   /v2/read
    v2 := router.Group("/v2")
    {
        v2.POST("/login", login)
        v2.POST("/submit", submit)
        v2.POST("/read", read)
    }

    router.Run(":8080")
}

Gin中间件

//计算请求耗时

func StatCost() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()

        //可以设置一些公共参数
        c.Set("example", "12345")
        //等其他中间件先执行
        c.Next()
        //获取耗时
        latency := time.Since(t)
        log.Printf("total cost time:%d us", latency/1000)
    }
}

func main() {
    //r := gin.New()
    r := gin.Default()
    r.Use(StatCost())

    r.GET("/test", func(c *gin.Context) {
        example := c.MustGet("example").(string)

        // it would print: "12345"
        log.Println(example)
        c.JSON(http.StatusOK, gin.H{
            "message": "success",
        })
    })

    // Listen and serve on 0.0.0.0:8080
    r.Run()
}
// 从第三方获取数据

func main() {
    router := gin.Default()
    router.GET("/someDataFromReader", func(c *gin.Context) {
        response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png")
        if err != nil || response.StatusCode != http.StatusOK {
            c.Status(http.StatusServiceUnavailable)
            return
        }

        reader := response.Body
        contentLength := response.ContentLength
        contentType := response.Header.Get("Content-Type")

        extraHeaders := map[string]string{
            "Content-Disposition": `attachment; filename="gopher.png"`,
        }

        c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
    })
    router.Run(":8080")
}

Gin写日志

//写日志到文件

func main() {
    // Disable Console Color, you don't need console color when writing the logs to file.
    gin.DisableConsoleColor()

    // Logging to a file.
    f, _ := os.Create("/tmp/gin.log")

    gin.DefaultWriter = io.MultiWriter(f)

    // Use the following code if you need to write the logs to file and console at the same time.
    // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
    //Default返回一个默认的路由引擎
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
// 自定义日志格式

func main() {
    router := gin.New()

    // LoggerWithFormatter 中间件会将日志写入 gin.DefaultWriter
    // By default gin.DefaultWriter = os.Stdout
    router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {

        // 你的自定义格式
        return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
                param.ClientIP,
                param.TimeStamp.Format(time.RFC1123),
                param.Method,
                param.Path,
                param.Request.Proto,
                param.StatusCode,
                param.Latency,
                param.Request.UserAgent(),
                param.ErrorMessage,
        )
    }))
    router.Use(gin.Recovery())

    router.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })

    router.Run(":8080")
}

原文地址:https://www.cnblogs.com/iiiiiher/p/12014263.html

时间: 2024-10-18 18:33:09

[go]gin框架的相关文章

基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的登陆逻辑在其他博主的文章中已经总结得非常详尽,比如我参考的是这篇博文:微信小程序登录逻辑整理,所以在这里不再赘述,只是大致归纳一下我的实现流程: 在小程序端调用wx.login方法,异步获得到微信下发的 jscode ,然后将 jscode 发送到 golang 服务端(如果需要详细用户信息,见参考

gin框架中自定义向log中写入极速快三源码搭建调试信息

我们在极速快三源码搭建项目的调试过程中,需要将一些自定义信息写入到log文件中,gin框架中提供了基础的Logger()方法,查看gin的文档,有如下信息:企 娥:217 1793 408 How to write log file func main() {// Disable Console Color, you don't need console color when writing the logs to file.gin.DisableConsoleColor() // Loggin

Golang 的Gin框架入门教学

学习Golang差不多有一个星期时间,开始自己做点小功能,练练手. Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https://github.com/gin-gonic/gin 安装框架 配置好GOPATH,建议自己在GOPATH建个项目,这里我以aze.org作为项目目录. $ go get github.com/gin-gonic/gin 安装

Go最火的Gin框架简单入门

Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https://github.com/gin-gonic/gin 安装框架 配置好GOPATH,建议自己在GOPATH建个项目,这里我以Go_GinStart作为项目目录. $ go get github.com/gin-gonic/gin 安装mysql驱动 $ go get github.com/go

基于gin框架搭建的一个简单的web服务

刚把go编程基础知识学习完了,学习的时间很短,可能还有的没有完全吸收.不过还是在项目中发现知识,然后在去回顾已学的知识,现在利用gin这个web框架做一个简单的CRUD操作. 1.Go Web框架的技术选型 Top 6 web frameworks for Go as of 2017,可以看看这个go语言中Web框架的对比和老大的推荐,我选择gin框架作为学习go语言的框架. image.png 2.Gin介绍 gin框架的中文文档,这个文档相当好,清晰明了解释gin框架的整个用法.下面是gin

Gin框架介绍及使用

Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. Gin框架介绍 Go世界里最流行的Web框架,Github上有24K+star. 基于httprouter开发的Web框架. 中文文档齐全,简单易用的轻量级框架. Gin框架安装与使用 安装 下载并安装Gin: go get -u github.com/gin-gonic/gin 第一个Gin示例:

golang gin框架中实现大文件的流式上传

一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式上传. 还非常不完美,但是可以作为参考: upload.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>up

Gin框架04:趣谈参数绑定与校验

导读 在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验. 为什么校验参数? 本不必抛出这个问题的,但顾及到初出茅庐的同学,这里解释一下. 假设做一个注册接口,传过来的用户名是不是不能太骚气?比如一堆空格和符号之类的:密码是不是不能太长也不能太短?手机号是不是要符合规则?性别是不是不能填人妖? 另外,登录的时候我们也需要验证账号密码是不是正确的,那么为了方便上手,咱就先来个简单示例,做登录验证. 激情演示 做登录之前得先想清楚需要对用户名密码做什

golang gin框架 使用swagger生成api文档

github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag 2.在main.go所在目录执行 $ swag init 生成docs/doc.go以及docs/swagger.json,docs/swagger.yaml 3.下载gin-swagger $ go get -u github.com/swaggo/gin-swagger $ go get -u