golang简单快速的HTTP应用开发web框架插件rux的使用
Golang简单快速的HTTP应用开发Web框架插件Rux的使用
Rux是一个简单快速的Web框架,用于构建Golang HTTP应用程序。它具有以下特点:
- 快速路由匹配,支持路由分组
- 支持路由路径参数和命名路由
- 支持缓存最近访问的动态路由
- 支持路由中间件、分组中间件和全局中间件
- 支持快速添加RESTFul或Controller风格的结构体
- 支持通用的
http.Handler
接口中间件 - 支持静态文件访问处理
- 支持添加处理程序来处理
NotFound
和NotAllowed
安装
go get github.com/gookit/rux
快速开始
package main
import (
"github.com/gookit/rux"
)
func main() {
r := rux.New()
// 添加路由:
r.GET("/", func(c *rux.Context) {
c.Text(200, "hello")
})
r.GET("/hello/{name}", func(c *rux.Context) {
c.Text(200, "hello " + c.Param("name"))
})
r.POST("/post", func(c *rux.Context) {
c.Text(200, "hello")
})
// 为路由路径添加多种方法支持
r.Add("/post[/{id}]", func(c *rux.Context) {
if c.Param("id") == "" {
// 创建帖子
c.Text(200, "created")
return
}
id := c.Params.Int("id")
// 更新帖子
c.Text(200, "updated " + fmt.Sprint(id))
}, rux.POST, rux.PUT)
// 启动服务器
r.Listen(":8080")
// 也可以使用
// http.ListenAndServe(":8080", r)
}
路由分组
r.Group("/articles", func() {
r.GET("", func(c *rux.Context) {
c.Text(200, "view list")
})
r.POST("", func(c *rux.Context) {
c.Text(200, "create ok")
})
r.GET(`/{id:\d+}`, func(c *rux.Context) {
c.Text(200, "view detail, id: " + c.Param("id"))
})
})
路径参数
可以像这样添加路径参数:{id}
或 {id:\d+}
// 可以通过"/blog/123"访问
r.GET(`/blog/{id:\d+}`, func(c *rux.Context) {
c.Text(200, "view detail, id: " + c.Param("id"))
})
可选参数,如/about[.html]
或/posts[/{id}]
:
// 可以通过"/blog/my-article"或"/blog/my-article.html"访问
r.GET(`/blog/{title:\w+}[.html]`, func(c *rux.Context) {
c.Text(200, "view detail, id: " + c.Param("id"))
})
r.Add("/posts[/{id}]", func(c *rux.Context) {
if c.Param("id") == "" {
// 创建帖子
c.Text(200, "created")
return
}
id := c.Params.Int("id")
// 更新帖子
c.Text(200, "updated " + fmt.Sprint(id))
}, rux.POST, rux.PUT)
使用中间件
Rux支持使用中间件,允许:
- 全局中间件
- 分组中间件
- 路由中间件
调用顺序:全局中间件 -> 分组中间件 -> 路由中间件
示例:
package main
import (
"fmt"
"github.com/gookit/rux"
)
func main() {
r := rux.New()
// 添加全局中间件
r.Use(func(c *rux.Context) {
// 做一些事情...
})
// 为路由添加中间件
route := r.GET("/middle", func(c *rux.Context) { // 主处理程序
c.WriteString("-O-")
}, func(c *rux.Context) { // 中间件1
c.WriteString("a")
c.Next() // 注意:调用Next()
c.WriteString("A")
// 如果调用Abort(),将在中间件运行结束时中止
// c.Abort()
})
// 通过Use()添加更多
route.Use(func(c *rux.Context) { // 中间件2
c.WriteString("b")
c.Next()
c.WriteString("B")
})
// 现在访问URI /middle
// 将输出: ab-O-BA
}
- 调用顺序:
中间件1 -> 中间件2 -> 主处理程序 -> 中间件2 -> 中间件1
- 流程图:
+-----------------------------+
| middle 1 |
| +----------------------+ |
| | middle 2 | |
start | | +----------------+ | | end
------->| | | main handler | | |--->----
| | |________________| | |
| |______________________| |
|_____________________________|
使用http.Handler
Rux支持通用的http.Handler
接口中间件
你可以使用
rux.WrapHTTPHandler()
将http.Handler
转换为rux.HandlerFunc
package main
import (
"net/http"
"github.com/gookit/rux"
// 这里我们使用gorilla/handlers,它提供了一些通用的处理程序
"github.com/gorilla/handlers"
)
func main() {
r := rux.New()
// 创建一个简单的通用http.Handler
h0 := http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
w.Header().Set("new-key", "val")
})
r.Use(rux.WrapHTTPHandler(h0), rux.WrapHTTPHandler(handlers.ProxyHeaders()))
r.GET("/", func(c *rux.Context) {
c.Text(200, "hello")
})
// 添加路由...
// 用我们的gzip处理程序包装服务器以压缩所有响应
http.ListenAndServe(":8000", handlers.CompressHandler(r))
}
更多用法
静态资源
package main
import (
"embed"
"net/http"
"github.com/gookit/rux"
)
//go:embed static
var embAssets embed.FS
func main() {
r := rux.New()
// 单个文件
r.StaticFile("/site.js", "testdata/site.js")
// 允许目录中的任何文件
r.StaticDir("/static", "testdata")
// 限制目录中的文件类型
r.StaticFiles("/assets", "testdata", "css|js")
// go 1.16+: 使用嵌入资源。访问: /embed/static/some.html
r.StaticFS("/embed", http.FS(embAssets))
}
命名路由
在rux
中,你可以添加命名路由,并根据名称从路由器获取相应的路由实例(rux.Route
)。
示例:
r := rux.New()
// 方法1
myRoute := rux.NewNamedRoute("name1", "/path4/some/{id}", emptyHandler, "GET")
r.AddRoute(myRoute)
// 方法2
rux.AddNamed("name2", "/", func(c *rux.Context) {
c.Text(200, "hello")
})
// 方法3
r.GET("/hi", func(c *rux.Context) {
c.Text(200, "hello")
}).NamedTo("name3", r)
// 通过名称获取路由
myRoute = r.GetRoute("name1")
重定向
重定向到其他页面
r.GET("/", func(c *rux.Context) {
c.AbortThen().Redirect("/login", 302)
})
// 或者
r.GET("/", func(c *rux.Context) {
c.Redirect("/login", 302)
c.Abort()
})
r.GET("/", func(c *rux.Context) {
c.Back()
c.Abort()
})
Cookies
你可以通过FastSetCookie()
DelCookie()
快速操作cookies
注意: 必须在写入BODY内容之前设置或删除cookies
r.GET("/setcookie", func(c *rux.Context) {
c.FastSetCookie("rux_cookie2", "test-value2", 3600)
c.SetCookie("rux_cookie", "test-value1", 3600, "/", c.Req.URL.Host, false, true)
c.WriteString("hello, in " + c.URL().Path)
})
r.GET("/delcookie", func(c *rux.Context) {
val := ctx.Cookie("rux_cookie") // "test-value1"
c.DelCookie("rux_cookie", "rux_cookie2")
})
更多示例
请参考原始内容中的更多示例代码,包括:
- 多域名支持
- RESTFul风格路由
- Controller风格路由
- 构建URL等
帮助
- 代码检查:
golint ./...
- 格式化检查:
gofmt -s -l ./
- 单元测试:
go test -cover ./...
许可证
MIT
更多关于golang简单快速的HTTP应用开发web框架插件rux的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang简单快速的HTTP应用开发web框架插件rux的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Rux框架快速开发Golang HTTP应用
Rux是一个简单、快速、轻量级的Golang Web框架,专为快速开发HTTP应用而设计。下面我将介绍Rux的基本使用方法和示例代码。
安装Rux
首先安装Rux框架:
go get github.com/gookit/rux
基本示例
package main
import (
"github.com/gookit/rux"
)
func main() {
// 创建Rux实例
r := rux.New()
// 定义路由和处理函数
r.GET("/", func(c *rux.Context) {
c.Text(200, "Hello, Rux!")
})
r.GET("/hello/{name}", func(c *rux.Context) {
name := c.Param("name")
c.Text(200, "Hello, "+name)
})
// 启动HTTP服务器
r.Listen(":8080")
}
路由功能
Rux提供了丰富的路由功能:
// 基本路由
r.GET("/users", listUsers)
r.POST("/users", createUser)
r.PUT("/users/{id}", updateUser)
r.DELETE("/users/{id}", deleteUser)
// 路由组
userGroup := r.Group("/users")
{
userGroup.GET("", listUsers)
userGroup.POST("", createUser)
userGroup.GET("/{id}", getUser)
}
// 路由参数
r.GET("/posts/{year}/{month}/{title}", func(c *rux.Context) {
year := c.Param("year")
month := c.Param("month")
title := c.Param("title")
c.JSON(200, rux.M{
"year": year,
"month": month,
"title": title,
})
})
中间件
Rux支持中间件机制:
// 日志中间件
func loggerMiddleware(c *rux.Context) {
start := time.Now()
// 处理请求
c.Next()
// 记录日志
duration := time.Since(start)
log.Printf("[%s] %s %s %v", c.Method(), c.Path(), c.RemoteIP(), duration)
}
// 认证中间件
func authMiddleware(c *rux.Context) {
token := c.Header("Authorization")
if token != "valid-token" {
c.AbortWithStatus(401)
return
}
c.Next()
}
func main() {
r := rux.New()
// 全局中间件
r.Use(loggerMiddleware)
// 路由组中间件
api := r.Group("/api")
api.Use(authMiddleware)
{
api.GET("/data", getData)
}
r.Listen(":8080")
}
请求处理
// 获取请求数据
r.POST("/users", func(c *rux.Context) {
// 获取JSON请求体
var user struct {
Name string `json:"name"`
Email string `json:"email"`
}
if err := c.BindJSON(&user); err != nil {
c.JSON(400, rux.M{"error": err.Error()})
return
}
// 获取查询参数
page := c.Query("page", "1")
// 获取表单数据
age := c.Form("age", "0")
// 返回JSON响应
c.JSON(201, rux.M{
"name": user.Name,
"email": user.Email,
"page": page,
"age": age,
})
})
静态文件服务
func main() {
r := rux.New()
// 静态文件服务
r.Static("/static", "./public")
// 单个文件
r.StaticFile("/favicon.ico", "./public/favicon.ico")
r.Listen(":8080")
}
模板渲染
func main() {
r := rux.New()
// 配置模板
r.SetTemplateConfig(&rux.TemplateConfig{
ViewDir: "views",
Layout: "layouts/main",
Ext: ".html",
FuncMap: template.FuncMap{},
DisableCache: false,
})
// 渲染模板
r.GET("/", func(c *rux.Context) {
c.HTML(200, "home", rux.M{
"title": "Home Page",
})
})
r.Listen(":8080")
}
错误处理
func main() {
r := rux.New()
// 自定义404处理
r.NotFound(func(c *rux.Context) {
c.JSON(404, rux.M{"error": "not found"})
})
// 自定义错误处理
r.OnError = func(c *rux.Context, err interface{}) {
c.JSON(500, rux.M{"error": "internal server error"})
}
r.GET("/panic", func(c *rux.Context) {
panic("something went wrong")
})
r.Listen(":8080")
}
完整示例
package main
import (
"log"
"net/http"
"time"
"github.com/gookit/rux"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
var users = []User{
{1, "Alice", "alice@example.com"},
{2, "Bob", "bob@example.com"},
}
func loggerMiddleware(c *rux.Context) {
start := time.Now()
c.Next()
log.Printf("[%s] %s %s %v", c.Method(), c.Path(), c.RemoteIP(), time.Since(start))
}
func authMiddleware(c *rux.Context) {
if c.Header("X-API-KEY") != "secret" {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
c.Next()
}
func listUsers(c *rux.Context) {
c.JSON(http.StatusOK, rux.M{"users": users})
}
func getUser(c *rux.Context) {
id := c.ParamInt("id")
for _, user := range users {
if user.ID == id {
c.JSON(http.StatusOK, user)
return
}
}
c.AbortWithStatus(http.StatusNotFound)
}
func createUser(c *rux.Context) {
var user User
if err := c.BindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, rux.M{"error": err.Error()})
return
}
// 模拟ID生成
user.ID = len(users) + 1
users = append(users, user)
c.JSON(http.StatusCreated, user)
}
func main() {
r := rux.New()
// 全局中间件
r.Use(loggerMiddleware)
// API路由组
api := r.Group("/api")
api.Use(authMiddleware)
{
api.GET("/users", listUsers)
api.POST("/users", createUser)
api.GET("/users/{id}", getUser)
}
// 静态文件
r.Static("/static", "./public")
// 启动服务器
log.Println("Server started at :8080")
r.Listen(":8080")
}
Rux框架简洁高效,适合快速开发中小型Web应用。它提供了路由、中间件、请求处理、模板渲染等核心功能,同时保持了轻量级和易用性。