如何基于OpenAPI Schema验证Go HTTP请求?求类似express-openapi-validator的包
适用于Go-chi的OpenAPI请求验证工具推荐
以下几个Go包可以满足你基于YAML格式OpenAPI规范验证HTTP请求的需求,无需为每个端点手动定义结构体,且能很好适配go-chi路由:
1. kin-openapi
这是Go生态中成熟度较高的OpenAPI 3.x工具库,提供完整的请求验证能力,可直接加载YAML格式的OpenAPI规范,自动校验请求的路径、参数、请求体等内容。
你可以通过其openapi3filter模块配合go-chi实现中间件验证,示例代码如下:
package main import ( "net/http" "github.com/getkin/kin-openapi/openapi3" "github.com/getkin/kin-openapi/openapi3filter" "github.com/getkin/kin-openapi/routers/chi" "github.com/go-chi/chi/v5" ) func main() { // 加载本地OpenAPI YAML规范文件 loader := openapi3.NewLoader() spec, err := loader.LoadFromFile("openapi.yaml") if err != nil { panic(err) } // 创建适配go-chi的路由解析器 router, err := chi.NewRouter(spec) if err != nil { panic(err) } r := chi.NewRouter() // 注册OpenAPI验证中间件 r.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { // 匹配当前请求对应的OpenAPI接口定义 route, pathParams, err := router.FindRoute(req) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // 构建验证参数 validationInput := &openapi3filter.RequestValidationInput{ Request: req, PathParams: pathParams, Route: route, } // 执行请求验证 if err := openapi3filter.ValidateRequest(req.Context(), validationInput); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } next.ServeHTTP(w, req) }) }) // 注册业务路由端点 r.Post("/api/users", func(w http.ResponseWriter, req *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte("User created successfully")) }) http.ListenAndServe(":8080", r) }
2. go-openapi/validate
属于go-openapi生态组件,支持直接基于OpenAPI规范完成请求校验,无需手动生成结构体,可轻松封装为go-chi中间件使用,核心逻辑是依托规范文件完成请求与定义的匹配校验。
这些工具的工作模式和你熟悉的express-openapi-validator一致:直接加载YAML规范,自动匹配请求对应的API定义并完成全量校验,完全省去了为每个端点单独定义结构体的重复工作。
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

