Go语言 Echo框架将请求数据绑定到Option[T]单元

11dmarpk  于 2023-03-06  发布在  Go
关注(0)|答案(1)|浏览(116)

假设我有一个用Golang Echo框架实现的REST API,我希望有一种方法在请求中使用可选的查询参数。
我想使用samber/mo库中的Option[T]单子。
例如,我有一个描述两个查询参数的结构:

type SearchInput struct {
    MinPrice    mo.Option[float64] `query:"minPrice"`
    MaxPrice    mo.Option[float64] `query:"maxPrice"`
    SearchQuery mo.Option[string]  `query:"searchQuery"`
}

如果我必须绑定常规的float64字段,我会使用Echo中的ctx.Bind()方法。然而,Echo没有为Option[T]实现绑定器。准确地说,Echo设法绑定Option[float64],但在尝试绑定Option[string]时产生错误。
我如何创建一个自定义绑定器?Echo文档给出了一个小提示,但没有提供任何有意义的示例。此外,我可以使用BindUnmarshaller()接口,但在文档中没有实际示例仍然不清楚。
我尝试搜索Echo存储库问题/讨论中提到的类似问题,但没有发现任何重要问题。

4ktjp1zp

4ktjp1zp1#

要使它开箱即用,您需要将字符串查询参数用双引号括起来。

func main() {
    e := echo.New()
    u := "/foo?minPrice=0.99&maxPrice=9.99&searchQuery=\"abc+def\""
    r := httptest.NewRequest("GET", u, nil)
    w := httptest.NewRecorder()
    c := e.NewContext(r, w)
    var in SearchInput
    if err := c.Bind(&in); err != nil {
        panic(err.Error())
    }
    fmt.Println(in)
}

输出:

{{true 0.99} {true 9.99} {true abc def}}

如果你想接受不带引号的字符串,你需要声明一个包含选项类型的自定义类型,并让自定义类型实现echo.BindUnmarshaler接口或encoding.TextUnmarshaler接口。
一个二个一个一个
输出:

{{true 0.99} {true 9.99} {{true abc def}}}

相关问题