Echo Groupes de travail avec OpenAPI code généré à l'aide de l'oapi-codegen

0

La question

Je suis à l'aide de l'oapi-codegen pour générer mon code serveur d'Écho et de Labstack que le serveur. Lorsque je passe un Group exemple de Openapi.RegisterHandlers au lieu d'une Echo exemple, j'ai toujours une erreur 400 avec {"message":"no matching operation was found"} pour toute demande de ce groupe:

    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{})

Si envoyer la demande /api/foofoo est une API de point de terminaison définis dans le générés code serveur, j'obtiens une erreur 400. Si je ne /api/<some undefined api> Je reçois aussi des 400. Si je dois envoyer une demande d' /baz, Je reçois 404 comme prévu, puisque ce n'est pas une route définie. Si je ne passe pas un préfixe Group(), J'obtiens une erreur 400 pour chaque demande. Je reçois le même problème si j'utilise RegisterHandlersWithBaseURL()

go go-echo openapi
2021-11-23 20:35:13
1

La meilleure réponse

0

Il semble y avoir un bug où si vous spécifiez un chemin d'accès de base, soit à la Group() fonction ou à RegisterHandlersWithBaseURL()leOapiRequestValidator milieu ignore le chemin d'accès de base lors de la vérification le chemin de la requête à l'encontre de la routes. Il utilise les itinéraires définis dans le OpenAPI spec sans le chemin d'accès de base. Pour contourner ce problème, j'ai a remplacé le inline.tmpl modèle et piraté le GetSwagger() la fonction d'inclure cela dans le bas:

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
}

La clé dans le Path la carte est de la route. Je viens d'ajouter le chemin d'accès de base à chaque touche.

2021-11-30 04:00:22

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................