使用oapi-codegen生成代码时Echo Group路由组返回400错误如何解决
问题根因
该错误由OapiRequestValidator中间件的路径匹配逻辑和Echo路由组前缀不匹配导致:
- 你的OpenAPI规范中定义的接口路径未包含
/api前缀(例如规范内定义路径为/foo) - 给Echo Group设置
/api前缀后,实际请求路径为/api/foo - 中间件默认直接用完整请求路径和OpenAPI规范内的路径做匹配,找不到对应接口定义,就返回
no matching operation was found的400错误 - 你请求
/baz时没有匹配到/api路由组,不会触发校验中间件,因此直接返回Echo默认的404响应,和你观察到的现象完全吻合
解决方法
以下3种方案均可解决问题,根据你的使用场景选择即可:
方案1:给请求校验中间件配置BasePath
初始化校验中间件时指定和路由组一致的前缀,中间件会自动去掉该前缀后再做路径匹配,修改后的代码如下:
swagger, err := Openapi.GetSwagger() if err != nil { fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err) os.Exit(1) } // 使用带配置的校验中间件,指定BasePath和路由组前缀一致 g := e.Group("/api", middleware.OapiRequestValidatorWithOptions(swagger, &middleware.Options{ BasePath: "/api", })) Openapi.RegisterHandlers(g, &MyApi{})
如果使用v2版本的oapi-codegen,需要导入github.com/oapi-codegen/echo-middleware/v2包,调用对应包下的OapiRequestValidatorWithOptions方法即可,参数逻辑完全一致。
方案2:调整OpenAPI规范的全局路径前缀
在你的OpenAPI yaml/json规范文件中添加servers配置,指定全局basePath为/api:
servers: - url: /api
修改完成后重新生成服务端代码,原有代码不需要做任何调整即可正常运行。
方案3:注册中间件到全局Echo实例
如果不需要对路由做区分校验,也可以把中间件注册到Echo全局实例上,再调用RegisterHandlersWithBaseURL指定前缀:
swagger, err := Openapi.GetSwagger() if err != nil { fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err) os.Exit(1) } e.Use(middleware.OapiRequestValidator(swagger)) Openapi.RegisterHandlersWithBaseURL(e, &MyApi{}, "/api")
内容的提问来源于stack exchange,提问作者user2233706
相关产品推荐
相关产品推荐

