从请求url动态解析路径参数

问题描述 投票:0回答:1

我正在开发一个使用

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()根据定义需要我需要选择值的键)

go parsing go-gin go-fiber
1个回答
0
投票

也许这有帮助,我会这样做。因为您应该知道您期望哪些参数,所以您可以确定下一个参数是否是您需要的值。

足足花了五分钟:

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]
© www.soinside.com 2019 - 2024. All rights reserved.