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. 安装使用
安装。
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"
导包。
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")
}