From 2ef7f7e10c1e11f749cc7788bbd46289c2efea9d Mon Sep 17 00:00:00 2001 From: Felix Hao Date: Tue, 6 Aug 2019 17:45:41 +0800 Subject: [PATCH] add bm path param doc (#253) --- doc/wiki-cn/blademaster-quickstart.md | 49 ++++++++++++++++++++++++++- pkg/net/http/blademaster/ratelimit.go | 2 +- pkg/net/http/blademaster/tree.go | 6 ++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/doc/wiki-cn/blademaster-quickstart.md b/doc/wiki-cn/blademaster-quickstart.md index ce1f7ef05..d3437a2c0 100644 --- a/doc/wiki-cn/blademaster-quickstart.md +++ b/doc/wiki-cn/blademaster-quickstart.md @@ -51,7 +51,8 @@ func initRouter(e *bm.Engine) { e.Ping(ping) // engine自带的"/ping"接口,用于负载均衡检测服务健康状态 g := e.Group("/kratos-demo") // e.Group 创建一组 "/kratos-demo" 起始的路由组 { - g.GET("/start", howToStart) // g.GET 创建一个 "kratos-demo/start" 的路由,默认处理Handler为howToStart方法 + g.GET("/start", howToStart) // g.GET 创建一个 "kratos-demo/start" 的路由,使用GET方式请求,默认处理Handler为howToStart方法 + g.POST("start", howToStart) // g.POST 创建一个 "kratos-demo/start" 的路由,使用POST方式请求,默认处理Handler为howToStart方法 } } ``` @@ -111,6 +112,52 @@ curl 'http://127.0.0.1:8000/metadata' } ``` +# 路径参数 + +使用方式如下: + +```go +func initRouter(e *bm.Engine) { + e.Ping(ping) + g := e.Group("/kratos-demo") + { + g.GET("/start", howToStart) + + // 路径参数有两个特殊符号":"和"*" + // ":" 跟在"/"后面为参数的key,匹配两个/中间的值 或 一个/到结尾(其中不再包含/)的值 + // "*" 跟在"/"后面为参数的key,匹配从 /*开始到结尾的所有值,所有*必须写在最后且无法多个 + + // NOTE:这是不被允许的,会和 /start 冲突 + // g.GET("/:xxx") + + // NOTE: 可以拿到一个key为name的参数。注意只能匹配到/param1/felix,无法匹配/param1/felix/hao(该路径会404) + g.GET("/param1/:name", pathParam) + // NOTE: 可以拿到多个key参数。注意只能匹配到/param2/felix/hao/love,无法匹配/param2/felix或/param2/felix/hao + g.GET("/param2/:name/:value/:felid", pathParam) + // NOTE: 可以拿到一个key为name的参数 和 一个key为action的路径。 + // NOTE: 如/params3/felix/hello,action的值为"/hello" + // NOTE: 如/params3/felix/hello/hi,action的值为"/hello/hi" + // NOTE: 如/params3/felix/hello/hi/,action的值为"/hello/hi/" + g.GET("/param3/:name/*action", pathParam) + } +} + +func pathParam(c *bm.Context) { + name, _ := c.Params.Get("name") + value, _ := c.Params.Get("value") + felid, _ := c.Params.Get("felid") + action, _ := c.Params.Get("action") + path := c.RoutePath // NOTE: 获取注册的路由原始地址,如: /kratos-demo/param1/:name + c.JSONMap(map[string]interface{}{ + "name": name, + "value": value, + "felid": felid, + "action": action, + "path": path, + }, nil) +} +``` + # 性能分析 启动时默认监听了`2333`端口用于`pprof`信息采集,如: diff --git a/pkg/net/http/blademaster/ratelimit.go b/pkg/net/http/blademaster/ratelimit.go index 033713f7e..352ec3bae 100644 --- a/pkg/net/http/blademaster/ratelimit.go +++ b/pkg/net/http/blademaster/ratelimit.go @@ -16,7 +16,7 @@ type RateLimiter struct { logTime int64 } -// New return a ratelimit middleware. +// NewRateLimiter return a ratelimit middleware. func NewRateLimiter(conf *bbr.Config) (s *RateLimiter) { return &RateLimiter{ group: bbr.NewGroup(conf), diff --git a/pkg/net/http/blademaster/tree.go b/pkg/net/http/blademaster/tree.go index eaeec92bd..5aeca05a6 100644 --- a/pkg/net/http/blademaster/tree.go +++ b/pkg/net/http/blademaster/tree.go @@ -5,9 +5,9 @@ package blademaster import ( -"net/url" -"strings" -"unicode" + "net/url" + "strings" + "unicode" ) // Param is a single URL parameter, consisting of a key and a value.