Generate an openapi spec dynamically based on the types used to handle request and response.
It works with any router, it is simple to add support to your router implementing the apirouter interface.
The routers supported out of the box are:
This lib uses kin-openapi to automatically generate and serve a swagger file.
To convert struct to schemas, we use jsonschema library.
The struct must contains the appropriate struct tags to be inserted in json schema to generate the schema dynamically.
It is always possible to add a totally custom swagger schema using kin-openapi.
To use it, install with
go get github.com/davidebianchi/gswagger
An example usage of this lib with gorilla mux:
context := context.Background()
muxRouter := mux.NewRouter()
router, _ := swagger.NewRouter(gorilla.NewRouter(muxRouter), swagger.Options{
Context: context,
Openapi: &openapi3.T{
Info: &openapi3.Info{
Title: "my title",
Version: "1.0.0",
},
},
})
okHandler := func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
}
type User struct {
Name string `json:"name" jsonschema:"title=The user name,required" jsonschema_extras:"example=Jane"`
PhoneNumber int `json:"phone" jsonschema:"title=mobile number of user"`
Groups []string `json:"groups,omitempty" jsonschema:"title=groups of the user,default=users"`
Address string `json:"address" jsonschema:"title=user address"`
}
type errorResponse struct {
Message string `json:"message"`
}
router.AddRoute(http.MethodPost, "/users", okHandler, swagger.Definitions{
RequestBody: &swagger.ContentValue{
Content: swagger.Content{
"application/json": {Value: User{}},
},
},
Responses: map[int]swagger.ContentValue{
201: {
Content: swagger.Content{
"text/html": {Value: ""},
},
},
401: {
Content: swagger.Content{
"application/json": {Value: &errorResponse{}},
},
Description: "invalid request",
},
},
})
router.AddRoute(http.MethodGet, "/users", okHandler, swagger.Definitions{
Responses: map[int]swagger.ContentValue{
200: {
Content: swagger.Content{
"application/json": {Value: &[]User{}},
},
},
},
})
carSchema := openapi3.NewObjectSchema().WithProperties(map[string]*openapi3.Schema{
"foo": openapi3.NewStringSchema(),
"bar": openapi3.NewIntegerSchema().WithMax(15).WithMin(5),
})
requestBody := openapi3.NewRequestBody().WithJSONSchema(carSchema)
operation := swagger.NewOperation()
operation.AddRequestBody(requestBody)
router.AddRawRoute(http.MethodPost, "/cars", okHandler, operation)
router.GenerateAndExposeOpenapi()
This configuration will output the schema shown here.
The path params, if not set in schema, are auto generated from the path. The format of the path parameters depends on the router library you are using, as explained below.
Gorilla Mux supports the path parameters as {someParam}
, for example as in /users/{userId}
.
Here is the example test.
The generated oas schema will contains userId
, carId
and driverId
as path params set to string.
If only one params is set, you must specify manually all the path params.
The generated OAS for this test case is visible here.
Fiber supports the path parameters as :someParam
, for example as in /users/:userId
.
Here is the example test
It is possible to create a new sub router from the swagger.Router. It is possible to add a prefix to all the routes created under the specific router (instead of use the router specific methods, if given, or repeat the prefix for every route).
It could also be useful if you need a sub router to create a group of APIs which use the same middleware (for example,this could be achieved by the SubRouter features of gorilla mux, for example).
To see the SubRouter example, please see the integration test of one of the supported routers.
-
How to add format
binary
? Formatsdate-time
,email
,hostname
,ipv4
,ipv6
,uri
could be added with tagjsonschema
. Others format could be added with tagjsonschema_extra
. Not all the formats are supported (see discovered unsupported formats here). -
How to add a swagger with
allOf
? You can create manually a swagger withallOf
using theAddRawRoute
method. -
How to add a swagger with
anyOf
? You can create manually a swagger withanyOf
using theAddRawRoute
method. -
How to add a swagger with
oneOf
? You can create manually a swagger withoneOf
using theAddRawRoute
method, or use the jsonschema struct tag.
Formats:
uuid
is unsupported by kin-openapi
We use SemVer for versioning. For the versions available, see the tags on this repository.