Группы Echo не работают с кодом, сгенерированным OpenAPI с использованием oapi-codegen

0

Вопрос

Я использую oapi-codegen для генерации своего серверного кода и Echo Labstack в качестве сервера. Когда я прохожу мимо Group пример для Openapi.RegisterHandlers вместо того, чтобы Echo например, я всегда получаю ошибку 400 с {"message":"no matching operation was found"} для любого запроса в этой группе:

    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 go-echo openapi
2021-11-23 20:35:13
1

Лучший ответ

0

Похоже, есть ошибка, когда, если вы укажете базовый путь, либо к Group() функции или для RegisterHandlersWithBaseURL(), вOapiRequestValidator middle игнорирует базовый путь при проверке пути запроса по маршрутам. Он использует маршруты, определенные в спецификации 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 карта-это маршрут. Я просто добавляю базовый путь к каждому ключу.

2021-11-30 04:00:22

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................