我正在开发一个使用
fiber/v2
路由器的项目,用于请求模拟服务。现在,通过请求正文和查询参数传递的参数不再是问题,并且可以轻松处理。但这是路径参数的问题:假设我们有一个像 http://host.org:port/
这样的基本端点,我将用“be”来表示它。现在对于像这样的URL
be/invoke/param1/param2
发送请求的用户可以选择仅发送
param1
或 param1
和 param2
两者,解析看起来像是一项艰巨的任务。情况可能有很多种,我认为很难一概而论。如果人们可以帮助解决这个案例,那就太好了,然后我们也许可以概括这个问题。
当然我们不需要看这样的案例:
be/invoke/param1/details/param2
这变得更加困难:P
附注我们正在严格尝试在 Fiber 中解决这个问题,因为将整个东西移植到 gin 中是不可行的,谢谢。
我提到Gin框架是因为它们同时实现了Query和Path参数解析。但我不太清楚他们是如何做到这一点的,也没有找到更多动态用例的示例。
编辑1:感谢Cerise的评论,问题更多地针对传递参数的检测(措辞使其看起来更通用:P)。有没有办法检测传递的未命名参数?或者在我的服务模拟存储库中添加服务时是否需要采用请求模式?
编辑2:我认为一个例子会让这一点更清楚:
我可以获得所有的 queyParams
qParams := c.Queries()
其中 c 的类型为 * Fiber.Ctx 并且 Queries() 返回查询和查询值对的映射。
我想对路径参数做类似的事情:
pathParams := Parameters(c)
其中Parameters()将返回所有路径参数(因为c.Params()根据定义需要我需要选择值的键)
也许这有帮助,我会这样做。因为您应该知道您期望哪些参数,所以您可以确定下一个参数是否是您需要的值。
足足花了五分钟:
http://127.0.0.1:3000/be/invoke/param1/details/param2/param3/param3details?foo=x&bar=test
package main
import (
"fmt"
"strings"
"github.com/gofiber/fiber/v2"
)
type ParamIndex int
type PathParams map[ParamIndex]string
func main() {
app := fiber.New()
app.Use("/invoke/*", func(c *fiber.Ctx) error {
path := strings.TrimPrefix(c.Path(), "/invoke/")
parts := strings.Split(path, "/")
pathParams := make(PathParams)
for i, part := range parts {
pathParams[ParamIndex(i)] = part
}
c.Locals("pathParams", pathParams)
c.Locals("queryParams", c.Queries())
return c.Next()
})
app.Get("/invoke/*", func(c *fiber.Ctx) error {
pathParams := c.Locals("pathParams").(PathParams)
queryParams := c.Locals("queryParams").(map[string]string)
fmt.Println(pathParams)
fmt.Println(queryParams)
return nil
})
app.Listen(":3000")
}
输出:
map[0:param1 1:details 2:param2 3:param3 4:param3details]
map[bar:test foo:x]