Swagger UI generator for Echo framework
 
 
 
Go to file
陈文强 2fa7b58c03
Merge pull request #26 from elvinchan/25
#25 Update swagger-ui version
2019-05-15 20:24:15 -05:00
examples #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
.gitignore Add core logic 2018-09-01 23:18:38 +08:00
.travis.yml Add TravisCI 2018-09-02 09:14:14 +08:00
LICENSE Initial commit 2018-08-30 21:41:51 +08:00
README.md #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
README_zh-CN.md #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
assets.go #25 Update swagger-ui version 2019-05-16 09:03:11 +08:00
converter.go #7 Fix relative path & add set scheme function 2018-09-17 09:03:27 +08:00
generator.go Fix bug of indirect & schema.Example 2018-09-04 20:09:11 +08:00
internal.go #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
internal_test.go #17 Add support for `map[string]interface{}` like type in schema 2019-01-07 13:17:27 +08:00
models.go Add skeleton 2018-08-31 20:47:37 +08:00
security.go Add core logic 2018-09-01 23:18:38 +08:00
security_test.go #19 Retrieve bathPath automatically 2019-05-11 22:27:52 +08:00
spec.go #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
spec_test.go #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00
tag.go #11 Remove `collect` swagger tag options 2018-09-22 09:52:46 +08:00
tag_test.go #11 Remove `collect` swagger tag options 2018-09-22 09:52:46 +08:00
utils.go #19 Retrieve bathPath automatically 2019-05-11 22:27:52 +08:00
validator.go #17 Add support for `map[string]interface{}` like type in schema 2019-01-07 13:17:27 +08:00
wrapper.go #21 Integrated doc HTML and spec JSON into one request 2019-05-12 23:10:04 +08:00
wrapper_test.go #23 Fix bug of matching path for spec 2019-05-13 16:35:11 +08:00

README.md

English | 简体中文

Echoswagger

Swagger UI generator for Echo framework

Go Report Card Build Status codecov

Feature

  • No SwaggerUI HTML/CSS dependency
  • Highly integrated with Echo, low intrusive design
  • Take advantage of the strong typing language and chain programming to make it easy to use
  • Recycle garbage in time, low memory usage

Installation

go get github.com/pangpanglabs/echoswagger

Example

package main

import (
	"net/http"

	"github.com/labstack/echo"
	"github.com/pangpanglabs/echoswagger"
)

func main() {
	// ApiRoot with Echo instance
	r := echoswagger.New(echo.New(), "/doc", nil)

	// Routes with parameters & responses
	r.POST("/", createUser).
		AddParamBody(User{}, "body", "User input struct", true).
		AddResponse(http.StatusCreated, "successful", nil, nil)

	// Start server
	r.Echo().Logger.Fatal(r.Echo().Start(":1323"))
}

type User struct {
	Name string
}

// Handler
func createUser(c echo.Context) error {
	return c.JSON(http.StatusCreated, nil)
}

Usage

Create a ApiRoot with New(), which is a wrapper of echo.New()

r := echoswagger.New(echo.New(), "/doc", nil)

You can use the result ApiRoot instance to:

  • Setup Security definitions, request/response Content-Types, UI options, Scheme, etc.
r.AddSecurityAPIKey("JWT", "JWT Token", echoswagger.SecurityInHeader).
	SetRequestContentType("application/x-www-form-urlencoded", "multipart/form-data").
	SetUI(UISetting{HideTop: true}).
	SetScheme("https", "http")
  • Get echo.Echo instance.
r.Echo()
  • Registers a new GET, POST, PUT, DELETE, OPTIONS, HEAD or PATCH route in default group, these are wrappers of Echo's create route methods. It returns a new Api instance.
r.GET("/:id", handler)
  • And: ↓

Create a ApiGroup with Group(), which is a wrapper of echo.Group()

g := r.Group("Users", "/users")

You can use the result ApiGroup instance to:

  • Set description, etc.
g.SetDescription("The desc of group")
  • Set security for all routes in this group.
g.SetSecurity("JWT")
  • Get echo.Group instance.
g.EchoGroup()
  • And: ↓

Registers a new route in ApiGroup

GET, POST, PUT, DELETE, OPTIONS, HEAD or PATCH methods are supported by Echoswagger, these are wrappers of Echo's create route methods.

a := g.GET("/:id", handler)

You can use the result Api instance to:

  • Add parameter with these methods:
AddParamPath(p interface{}, name, desc string)

AddParamPathNested(p interface{})

AddParamQuery(p interface{}, name, desc string, required bool)

AddParamQueryNested(p interface{})

AddParamForm(p interface{}, name, desc string, required bool)

AddParamFormNested(p interface{})

AddParamHeader(p interface{}, name, desc string, required bool)

AddParamHeaderNested(p interface{})

AddParamBody(p interface{}, name, desc string, required bool)

AddParamFile(name, desc string, required bool)

The methods which name's suffix are Nested means these methods treat parameter p 's fields as paramters, so it must be a struct type.

e.g.

type SearchInput struct {
	Q         string `query:"q" swagger:"desc(Keywords),required"`
	SkipCount int    `query:"skipCount"`
}
a.AddParamQueryNested(SearchInput{})

Is equivalent to:

a.AddParamQuery("", "q", "Keywords", true).
	AddParamQuery(0, "skipCount", "", false)
  • Add responses.
a.AddResponse(http.StatusOK, "response desc", body{}, nil)
  • Set Security, request/response Content-Types, summary, description, etc.
a.SetSecurity("JWT").
	SetResponseContentType("application/xml").
	SetSummary("The summary of API").
	SetDescription("The desc of API")
  • Get echo.Route instance.
a.Route()

With swagger tag, you can set more info with AddParam... methods.

e.g.

type User struct {
	Age    int       `swagger:"min(0),max(99)"`
	Gender string    `swagger:"enum(male|female|other),required"`
	Money  []float64 `swagger:"default(0),readOnly"`
}
a.AddParamBody(&User{}, "Body", "", true)

The definition is equivalent to:

{
    "definitions": {
        "User": {
            "type": "object",
            "properties": {
                "Age": {
                    "type": "integer",
                    "format": "int32",
                    "minimum": 0,
                    "maximum": 99
                },
                "Gender": {
                    "type": "string",
                    "enum": [
                        "male",
                        "female",
                        "other"
                    ],
                    "format": "string"
                },
                "Money": {
                    "type": "array",
                    "items": {
                        "type": "number",
                        "default": 0,
                        "format": "double"
                    },
                    "readOnly": true
                }
            },
            "required": [
                "Gender"
            ]
        }
    }
}

Supported swagger tags:

Tag Type Description
desc string Description.
maximum number -
minimum number -
maxLength integer -
minLength integer -
allowEmpty boolean Sets the ability to pass empty-valued parameters. This is valid only for either query or formData parameters and allows you to send a parameter with a name only or an empty value. Default value is false.
required boolean Determines whether this parameter is mandatory. If the parameter is in "path", this property is true without setting. Otherwise, the property MAY be included and its default value is false.
readOnly boolean Relevant only for Schema "properties" definitions. Declares the property as "read only". This means that it MAY be sent as part of a response but MUST NOT be sent as part of the request. Properties marked as readOnly being true SHOULD NOT be in the required list of the defined schema. Default value is false.
enum [*] Enumerate value, multiple values should be separated by "|"
default * Default value, which type is same as the field's type.

Reference

OpenAPI Specification 2.0

License

MIT