Introduction
A Go project for handling OpenAPI files. We target:
- OpenAPI
v2.0(formerly known as Swagger) - OpenAPI
v3.0 - OpenAPI
v3.1 - OpenAPI
v3.2Partially: Media Type ObjectitemSchema, Path Item Objectquery(the HTTPQUERYmethod) andadditionalOperations(custom HTTP methods).
Licensed under the MIT License.
Contributors, users and sponsors
The project has received pull requests from many people. Thanks to everyone!
Please, give back to this project by becoming a sponsor.
Here's some projects that depend on kin-openapi:
- github.com/go-fuego/fuego - "Framework generating OpenAPI 3 spec from source code"
- github.com/a-h/rest - "Generate OpenAPI 3.0 specifications from Go code without annotations or magic comments"
- github.com/Tufin/oasdiff - "A diff tool for OpenAPI Specification 3"
- github.com/danielgtaylor/apisprout - "Lightweight, blazing fast, cross-platform OpenAPI 3 mock server with validation"
- github.com/oapi-codegen/oapi-codegen - "Generate Go client and server boilerplate from OpenAPI 3 specifications"
- github.com/dunglas/vulcain - "Use HTTP/2 Server Push to create fast and idiomatic client-driven REST APIs"
- github.com/danielgtaylor/restish - "...a CLI for interacting with REST-ish HTTP APIs with some nice features built-in"
- github.com/goadesign/goa - "Design-based APIs and microservices in Go"
- github.com/hashicorp/nomad-openapi - "Nomad is an easy-to-use, flexible, and performant workload orchestrator that can deploy a mix of microservice, batch, containerized, and non-containerized applications. Nomad is easy to operate and scale and has native Consul and Vault integrations."
- gitlab.com/jamietanna/httptest-openapi (blog post) - "Go OpenAPI Contract Verification for use with
net/http" - github.com/SIMITGROUP/openapigenerator - "Openapi v3 microservices generator"
- https://github.com/projectsveltos/addon-controller - "Kubernetes add-on controller designed to manage tens of clusters."
- (Feel free to add your project by creating an issue or a pull request)
Alternatives
- libopenapi a fully featured, high performance OpenAPI 3.1, 3.0 and Swagger parser, library, validator and toolkit
- go-swagger stated OpenAPIv3 won't be supported
- swaggo has an open issue on OpenAPIv3
Be sure to check OpenAPI Initiative's great tooling list as well as OpenAPI.Tools.
Structure
- openapi2 (Go Reference)
- Support for OpenAPI 2 files, including serialization, deserialization, and validation.
- openapi2conv (Go Reference)
- Converts OpenAPI 2 files into OpenAPI 3 files.
- openapi3 (Go Reference)
- Support for OpenAPI 3 files, including serialization, deserialization, and validation.
- openapi3filter (Go Reference)
- Validates HTTP requests and responses
- Provides a gorilla/mux router for OpenAPI operations
- openapi3gen (Go Reference)
- Generates
*openapi3.Schemavalues for Go types.
- Generates
Some recipes
Validating an OpenAPI document
go run github.com/getkin/kin-openapi/cmd/validate@latest [--defaults] [--examples] [--ext] [--patterns] -- <local YAML or JSON file>
Loading OpenAPI document
Use openapi3.Loader, which resolves all references:
loader := openapi3.NewLoader()
doc, err := loader.LoadFromFile("my-openapi-spec.json")
Tracking source locations (Origin)
When IncludeOrigin is enabled, the loader records the file, line, and column of each element in the OpenAPI document. This is useful for tools that need to report errors or changes with precise source locations (e.g. linters, diff tools, editors).
loader := openapi3.NewLoader()
loader.IncludeOrigin = true
doc, err := loader.LoadFromFile("my-openapi-spec.json")
// Each element has an Origin field with source location info
fmt.Println(doc.Info.Origin.Key.File) // "my-openapi-spec.json"
fmt.Println(doc.Info.Origin.Key.Line) // 2
fmt.Println(doc.Info.Origin.Key.Column) // 1
The Origin struct contains three parts:
Key— the location of the object itself (file, line, column).Fields— locations of scalar fields within the object (e.g.origin.Fields["description"]gives the line of thedescriptionfield).Sequences— locations of items in sequence-valued fields. For example,origin.Sequences["enum"]gives the location of each item in anenumarray. This is used for fields likeenum,required, andserverswhere the individual items are scalars and don't have their ownOriginfield.
Origin data is populated by an internal post-processing step after YAML decoding — it is not part of the OpenAPI spec itself. For this reason, Origin fields are excluded from serialization. If you marshal a loaded document back to JSON/YAML, origin data will not appear in the output.
Identifying validation errors by code
Each validation error carries a stable, kebab-case code (e.g. operation-responses-required), independent of the message text, so tools can suppress specific findings, assign per-rule severities, or emit machine-readable diagnostics. The full catalog is available from openapi3.ValidationErrorCodes().
err := doc.Validate(ctx, openapi3.EnableMultiError())
for _, e := range err.(openapi3.MultiError) {
var coded openapi3.CodedError
if errors.As(e, &coded) {
fmt.Println(coded.Code(), e) // e.g. "operation-responses-required value of responses must be an object"
}
}
Getting OpenAPI operation that matches request
loader := openapi3.NewLoader()
doc, _ := loader.LoadFromData([]byte(`...`))
_ = doc.Validate(loader.Context)
router, _ := gorillamux.NewRouter(doc)
route, pathParams, _ := router.FindRoute(httpRequest)
// Do something with route.Operation
Validating HTTP requests/responses
package main
import (
"context"
"fmt"
"net/http"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/getkin/kin-openapi/routers/gorillamux"
)
func main() {
ctx := context.Background()
loader := &openapi3.Loader{Context: ctx, IsExternalRefsAllowed: true}
doc, _ := loader.LoadFromFile(".../My-OpenAPIv3-API.yml")
// Validate document
_ = doc.Validate(ctx)
router, _ := gorillamux.NewRouter(doc)
httpReq, _ := http.NewRequest(http.MethodGet, "/items", nil)
// Find route
route, pathParams, _ := router.FindRoute(httpReq)
// Validate request
requestValidationInput := &openapi3filter.RequestValidationInput{
Request: httpReq,
PathParams: pathParams,
Route: route,
}
_ = openapi3filter.ValidateRequest(ctx, requestValidationInput)
// Handle that