1. Gin框架

对于Golang而言,Web框架远比Python、Java之类的要小。Go自身的net/http足够简单,性能也不错。框架更是一个常用函数或者工具的集合。

2. Golang的Web框架

  • Gin是Golang的一个微框架,封装比较优雅,API友好,具有快速灵活,容错方便等特点。
  • Beego是开源的高性能Go语言Web框架。可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架。设计灵感来源于tornado、sinatra、flask这三个框架,但是结合了Go本身的一些特性(interface、struct继承等)而设计的一个框架。
  • Iris是最快的Go语言Web框架,完备MVC支持。提供了一个优美的表现力和容易使用下一个网站或API的基础。

3. 安装使用

项目地址

官方文档地址

  1. 安装。

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

    安装太慢可以使用代理

    Bash (Linux or macOS):

    # 配置 GOPROXY 环境变量
    export GOPROXY=https://proxy.golang.com.cn,direct
    # 还可以设置不走 proxy 的私有仓库或组,多个用逗号相隔(可选)
    export GOPRIVATE=git.mycompany.com,github.com/my/private
    

    PowerShell (Windows):

    # 配置 GOPROXY 环境变量
    $env:GOPROXY = "https://proxy.golang.com.cn,direct"
    # 还可以设置不走 proxy 的私有仓库或组,多个用逗号相隔(可选)
    $env:GOPRIVATE = "git.mycompany.com,github.com/my/private"
    
  2. 导包。

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

4. Demo

package main

import (
    "encoding/json"
    "github.com/gin-gonic/gin"
    "github.com/thinkerou/favicon"
    "log"
    "net/http"
)

// 自定义Go中间件(拦截器)
func myHandler() gin.HandlerFunc {
    return func(context *gin.Context) {
        // 通过自定义的中间件设置的值,在后续处理只要调用这个中间件的都可以拿到这里的参数
        context.Set("session", "mySession")
        // 放行
        context.Next()
        // 阻断
        //context.Abort()
    }
}

func main() {
    // 创建一个服务
    ginServer := gin.Default()
    // 使用favicon
    ginServer.Use(favicon.New("./favicon.ico"))
    // 注册中间件
    // 注册未指定则全局使用,指定一个则一个使用
    ginServer.Use(myHandler())

    // 访问地址
    ginServer.GET("/hello", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{"msg": "hello, world"})
    })

    ginServer.POST("/user", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{"msg": "post"})
    })

    ginServer.PUT("/user")
    ginServer.DELETE("/user")

    // 加载静态页面
    ginServer.LoadHTMLGlob("templates/*")
    // 加载资源文件
    ginServer.Static("/static", "./static")

    // 响应一个页面给前端
    ginServer.GET("/h1", func(context *gin.Context) {
        context.HTML(http.StatusOK, "index.html", gin.H{
            "msg": "success!",
        })
    })

    // 获取请求中的参数

    // url?userid=1&age=18
    ginServer.GET("user/info", myHandler(), func(context *gin.Context) {
        // 取出中间件的值
        session := context.MustGet("session").(string)
        log.Println(session)

        userid := context.Query("userid")
        age := context.Query("age")
        context.JSON(http.StatusOK, gin.H{
            "userid": userid,
            "age":    age,
        })
    })

    // url/1/18
    ginServer.GET("user/info2/:userid/:age", func(context *gin.Context) {
        userid := context.Param("userid")
        age := context.Param("age")
        context.JSON(http.StatusOK, gin.H{
            "userid": userid,
            "age":    age,
        })
    })

    // 前端给后端传递JSON
    ginServer.POST("/json", func(context *gin.Context) {
        // requestBody
        data, _ := context.GetRawData()

        var m map[string]interface{}
        _ = json.Unmarshal(data, &m)

        context.JSON(http.StatusOK, m)
    })

    // 表单
    ginServer.POST("/user/add", func(context *gin.Context) {
        username := context.PostForm("username")
        password := context.PostForm("password")

        context.JSON(http.StatusOK, gin.H{
            "username": username,
            "password": password,
        })
    })

    // 路由
    ginServer.GET("/test", func(context *gin.Context) {
        context.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
    })

    // 404
    ginServer.NoRoute(func(context *gin.Context) {
        context.HTML(http.StatusNotFound, "404.html", nil)
    })

    // 路由组    /user/add
    userGroup := ginServer.Group("/user")
    {
        userGroup.GET("/add", func(context *gin.Context) {

        })
        userGroup.POST("/login")
        userGroup.POST("/logout")
    }

    orderGroup := ginServer.Group("/order")
    {
        orderGroup.GET("/add")
        orderGroup.DELETE("/delete")
    }

    // 服务端口
    ginServer.Run(":8082")

}
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""