Introduction

The OpenAPI API documentation UI provided by default in GoFrame‘s Server is the open-source redoc component, which does not support the Try It Out feature on the page. Many developers ask if it’s possible to use the SwaggerUI page to display the OpenAPI API documentation. Some enterprises do not support connecting to certain external resources, so can the internal API documentation UI be replaced with resources accessible internally?

Anyone familiar with OpenAPI knows that it is merely a general API definition specification, and the displayed API documentation UI can be easily replaced. Moreover, there are many such UI APIs and platforms! Switching the API documentation UI page in GoFrame Server, or integrating the API documentation into a third-party documentation platform, is very simple! For details, see the example: gf/example/httpserver/swagger-set-template/main.go.

Usage Example

Let’s use code to illustrate how to quickly switch the API documentation UI to SwaggerUI. Links related to SwaggerUI:

main.go

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/net/ghttp"
  7. )
  8. // HelloReq hello request
  9. type HelloReq struct {
  10. g.Meta `path:"/hello" method:"get" sort:"1"`
  11. Name string `v:"required" dc:"Your name"`
  12. }
  13. // HelloRes hello response
  14. type HelloRes struct {
  15. Reply string `dc:"Reply content"`
  16. }
  17. // Hello Controller
  18. type Hello struct{}
  19. // Say function
  20. func (Hello) Say(ctx context.Context, req *HelloReq) (res *HelloRes, err error) {
  21. g.Log().Debugf(ctx, `receive say: %+v`, req)
  22. res = &HelloRes{
  23. Reply: fmt.Sprintf(`Hi %s`, req.Name),
  24. }
  25. return
  26. }
  27. const (
  28. MySwaggerUITemplate = `
  29. <!DOCTYPE html>
  30. <html lang="en">
  31. <head>
  32. <meta charset="utf-8" />
  33. <meta name="viewport" content="width=device-width, initial-scale=1" />
  34. <meta name="description" content="SwaggerUI"/>
  35. <title>SwaggerUI</title>
  36. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui.min.css" />
  37. </head>
  38. <body>
  39. <div id="swagger-ui"></div>
  40. <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui-bundle.js" crossorigin></script>
  41. <script>
  42. window.onload = () => {
  43. window.ui = SwaggerUIBundle({
  44. url: '{SwaggerUIDocUrl}',
  45. dom_id: '#swagger-ui',
  46. });
  47. };
  48. </script>
  49. </body>
  50. </html>
  51. `
  52. )
  53. func main() {
  54. s := g.Server()
  55. s.Use(ghttp.MiddlewareHandlerResponse)
  56. s.Group("/", func(group *ghttp.RouterGroup) {
  57. group.Bind(
  58. new(Hello),
  59. )
  60. })
  61. s.SetSwaggerUITemplate(MySwaggerUITemplate)
  62. s.Run()
  63. }

config.yaml

  1. server:
  2. address: ":8199"
  3. openapiPath: "/api.json"
  4. swaggerPath: "/swagger"

Here we define a single Hello API. As you can see, we use an endpoint to display the SwaggerUI HTML page and define the path to the OpenAPI API file as /api.json, without using the server’s built-in UI page. After execution, the terminal outputs:

  1. 2022-05-18 20:41:09.160 [INFO] openapi specification is serving at address: http://127.0.0.1:8199/api.json
  2. 2022-05-18 20:41:09.161 [INFO] pid[57888]: http server started listening on [:8199]
  3. ADDRESS | METHOD | ROUTE | HANDLER | MIDDLEWARE
  4. ----------|--------|-----------|-----------------------------------------------------------------|--------------------
  5. :8199 | ALL | /* | github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing | GLOBAL MIDDLEWARE
  6. ----------|--------|-----------|-----------------------------------------------------------------|--------------------
  7. :8199 | ALL | /api.json | github.com/gogf/gf/v2/net/ghttp.(*Server).openapiSpec |
  8. ----------|--------|-----------|-----------------------------------------------------------------|--------------------
  9. :8199 | GET | /hello | main.(*Hello).Say |
  10. ----------|--------|-----------|-----------------------------------------------------------------|--------------------
  11. :8199 | GET | /swagger | main.main.func1.1 |
  12. ----------|--------|-----------|-----------------------------------------------------------------|--------------------

Visit this link: http://127.0.0.1:8199/swagger/

The page is displayed as follows:

API Document - Custom UI - 图1

Developers customize other API documentation UIs in a similar way.

Common UI Templates

swagger-ui

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1" />
  6. <meta name="description" content="SwaggerUI"/>
  7. <title>SwaggerUI</title>
  8. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui.min.css" />
  9. </head>
  10. <body>
  11. <div id="swagger-ui"></div>
  12. <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui-bundle.js" crossorigin></script>
  13. <script>
  14. window.onload = () => {
  15. window.ui = SwaggerUIBundle({
  16. url: '{SwaggerUIDocUrl}',
  17. dom_id: '#swagger-ui',
  18. });
  19. };
  20. </script>
  21. </body>
  22. </html>

openapi-ui

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>openAPI UI</title>
  6. </head>
  7. <body>
  8. <div id="openapi-ui-container" spec-url="{SwaggerUIDocUrl}" theme="light"></div>
  9. <script src="https://cdn.jsdelivr.net/npm/openapi-ui-dist@latest/lib/openapi-ui.umd.js"></script>
  10. </body>
  11. </html>