GitHub - a-h/rest: Generate OpenAPI 3.0 specifications from Go code. (original) (raw)

REST

Document a REST API with an OpenAPI 3.0 specification.

Why would I want to use this?

Examples

See the ./examples directory for complete examples.

Create an OpenAPI 3.0 (swagger) file

// Configure the models. api := rest.NewAPI("messages") api.StripPkgPaths = []string{"github.com/a-h/rest/example", "github.com/a-h/respond"}

api.RegisterModel(rest.ModelOfrespond.Error, rest.WithDescription("Standard JSON error"), func(s *openapi3.Schema) { status := s.Properties["statusCode"] status.Value.WithMin(100).WithMax(600) })

api.Get("/topic/{id}"). HasPathParameter("id", rest.PathParam{ Description: "id of the topic", Regexp: \d+, }). HasResponseModel(http.StatusOK, rest.ModelOfmodels.Topic). HasResponseModel(http.StatusInternalServerError, rest.ModelOfrespond.Error)

// Create the specification. spec, err := api.Spec() if err != nil { log.Fatalf("failed to create spec: %v", err) }

// Write to stdout. enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") enc.Encode(spec)

Serve API documentation alongside your API

// Create routes. router := http.NewServeMux() router.Handle("/topics", &get.Handler{}) router.Handle("/topic", &post.Handler{})

api := rest.NewAPI("messages") api.StripPkgPaths = []string{"github.com/a-h/rest/example", "github.com/a-h/respond"}

// Register the error type with customisations. api.RegisterModel(rest.ModelOfrespond.Error, rest.WithDescription("Standard JSON error"), func(s *openapi3.Schema) { status := s.Properties["statusCode"] status.Value.WithMin(100).WithMax(600) })

api.Get("/topics"). HasResponseModel(http.StatusOK, rest.ModelOfget.TopicsGetResponse). HasResponseModel(http.StatusInternalServerError, rest.ModelOfrespond.Error)

api.Post("/topic"). HasRequestModel(rest.ModelOfpost.TopicPostRequest). HasResponseModel(http.StatusOK, rest.ModelOfpost.TopicPostResponse). HasResponseModel(http.StatusInternalServerError, rest.ModelOfrespond.Error)

// Create the spec. spec, err := api.Spec() if err != nil { log.Fatalf("failed to create spec: %v", err) }

// Apply any global customisation. spec.Info.Version = "v1.0.0." spec.Info.Description = "Messages API"

// Attach the Swagger UI handler to your router. ui, err := swaggerui.New(spec) if err != nil { log.Fatalf("failed to create swagger UI handler: %v", err) } router.Handle("/swagger-ui", ui) router.Handle("/swagger-ui/", ui)

// And start listening. fmt.Println("Listening on :8080...") fmt.Println("Visit http://localhost:8080/swagger-ui to see API definitions") fmt.Println("Listening on :8080...") http.ListenAndServe(":8080", router)

Tasks

test

run-example

Dir: ./examples/stdlib