golang简单快速的HTTP应用开发web框架插件rux的使用

Golang简单快速的HTTP应用开发Web框架插件Rux的使用

Rux是一个简单快速的Web框架,用于构建Golang HTTP应用程序。它具有以下特点:

  • 快速路由匹配,支持路由分组
  • 支持路由路径参数和命名路由
  • 支持缓存最近访问的动态路由
  • 支持路由中间件、分组中间件和全局中间件
  • 支持快速添加RESTFul或Controller风格的结构体
  • 支持通用的http.Handler接口中间件
  • 支持静态文件访问处理
  • 支持添加处理程序来处理NotFoundNotAllowed

GitHub go.mod Go version

安装

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

1 回复

更多关于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应用。它提供了路由、中间件、请求处理、模板渲染等核心功能,同时保持了轻量级和易用性。

回到顶部