Echo 组无法使用使用 oapi-codegen 的 OpenAPI 生成的代码

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

我正在使用 oapi-codegen 生成我的服务器代码,并使用 Echo Labstack 作为服务器。 当我将

Group
实例传递给
Openapi.RegisterHandlers
而不是
Echo
实例时,对于该组中的任何请求,我总是会收到带有
{"message":"no matching operation was found"}
的 400 错误:

    swagger, err := Openapi.GetSwagger()
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err)
        os.Exit(1)
    }

    // Use oapi validation middleware to check all requests against the
    // OpenAPI schema.
    g := e.Group("/api", middleware.OapiRequestValidator(swagger))
    Openapi.RegisterHandlers(g, &MyApi{})

如果发送请求

/api/foo
,其中
foo
是生成的服务器代码中定义的 API 端点,我会收到 400 错误。如果我这样做
/api/<some undefined api>
,我也会得到 400。如果我确实发送对
/baz
的请求,我会按预期得到 404,因为这不是定义的路线。如果我不向
Group()
传递前缀,每个请求都会收到 400 错误。如果我使用
RegisterHandlersWithBaseURL()

我会得到同样的行为
go openapi go-echo
2个回答
1
投票

似乎存在一个错误,如果您指定

Group()
函数或
RegisterHandlersWithBaseURL()
的基本路径,则在根据路由检查请求路径时,
OapiRequestValidator
中间会忽略基本路径。它使用 OpenAPI 规范中定义的路由,而不使用基本路径。为了解决这个问题,我覆盖了
inline.tmpl
模板并修改了
GetSwagger()
函数以将其包含在底部:

func GetSwagger(pathPrefix string) (swagger *openapi3.T, err error) {
...
    var updatedPaths openapi3.Paths = make(openapi3.Paths)

    for key, value := range(swagger.Paths) {
        updatedPaths[pathPrefix + key] = value
    }

    swagger.Paths = updatedPaths
}

Path
地图中的关键是路线。我只是将基本路径附加到每个键。


0
投票

如果您不想修改 tmpl,则可以进行另一个修复,请修改

的响应
func fixSwaggerPrefix(prefix string, swagger *openapi3.T) {
    var updatedPaths openapi3.Paths = openapi3.Paths{}

    for key, value := range swagger.Paths.Map() {
        updatedPaths.Set(prefix+key, value)
    }

    swagger.Paths = &updatedPaths
    return
}

© www.soinside.com 2019 - 2024. All rights reserved.