Как изменить формат URL для отображения документации?

#go #swagger #router #gorilla #go-swagger

# #Вперед #развязность #маршрутизатор #горилла #go-swagger

Вопрос:

Для приведенного ниже кода:

 import (

    "github.com/go-openapi/runtime/middleware"
    "github.com/gorilla/mux"
)

m := mux.NewRouter()

// handlers for API
getRouter := m.Methods(http.MethodGet).Subrouter()
getRouter.HandleFunc("/v1/items", someHandler.ListAll)

// handler for documentation
opts := middleware.RedocOpts{SpecURL: "/swagger.yaml"}
sh := middleware.Redoc(opts, nil)

getRouter.Handle("/docs", sh)
getRouter.Handle("/swagger.yaml", http.FileServer(http.Dir("./")))
 

http://localhost:8080/docs amp; http://localhost:8080/swagger.yaml отображает документацию. Обработчик Api также отлично работает с uri /v1/items

Для отображения документации для http://localhost:8080/v1/docs amp; http://localhost:8080/v1/swagger.yaml ниже сделаны изменения:

 m := mux.NewRouter()

// handlers for API
getRouter := m.Methods(http.MethodGet).PathPrefix("/v1").Subrouter()
getRouter.HandleFunc("/items", someHandler.ListAll)

// handler for documentation
opts := middleware.RedocOpts{SpecURL: "/swagger.yaml",BasePath: "/v1"}
sh := middleware.Redoc(opts, nil)

getRouter.Handle("/docs", sh)
getRouter.Handle("/swagger.yaml", http.FileServer(http.Dir("./")))
 

но не работает. Сбой обработчика api и обработчика документации

Как отобразить документацию на http://localhost:8080/v1/docs amp; http://localhost:8080/v1/swagger.yaml ?

Как включить api http://localhost:8080/v1/items ? С изменением префикса пути

Ответ №1:

Смотрим на промежуточное программное обеспечение.Метод Redoc и связанный шаблон параметр SpecURL используется напрямую и не имеет префикса базового пути.

Добавление обработчика для /swagger .yaml, похоже, работает.

 
type Items struct {}

type Item struct {
    Name string `json:"name"`
}

func (Items) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
    w.WriteHeader(http.StatusOK)
    encoder := json.NewEncoder(w)
    items := []Item{{"Hello"}, {"All"}}
    _ = encoder.Encode(items)
}

func main() {
    m := mux.NewRouter()

    v1routes := m.Methods(http.MethodGet).PathPrefix("/v1").Subrouter()

    opts := middleware.RedocOpts{SpecURL: "/swagger.yaml", BasePath: "/v1"}
    sh := middleware.Redoc(opts, nil)

    v1routes.Handle("/docs", sh)
    // Assumes that the swagger file is in the current working directory and not ./v1/swagger.yaml
    v1routes.Handle("/swagger.yaml", http.StripPrefix("/v1/", http.FileServer(http.Dir("./"))))

    err := http.ListenAndServe(":8000", m)

    fmt.Println(err)
}

 

HTTP.Файловому серверу нужен соответствующий путь. Таким образом, файл swagger либо должен находиться в папке ./ v1, либо необходимо удалить префикс / v1.

Комментарии:

1. Это не работает. О чем "/v1/items ? Для обработчика api

2. /v1/items работает сейчас, но /v1/docs не работает

Ответ №2:

Вы почти на месте. Вам просто нужно:

  • Удалите /v1 префикс из путей
  • Добавьте BasePath опцию в middleware.RedocOpts (см. Источник на github)
  • Добавьте PathPrefix метод в getRouter определение:
     // handlers for API
    getRouter := m.Methods(http.MethodGet).PathPrefix("/v1").Subrouter()

    // handler for documentation
    opts := middleware.RedocOpts{SpecURL: "/swagger.yaml", BasePath: "/v1"}
    sh := middleware.Redoc(opts, nil)

    getRouter.Handle("/docs", sh)
    getRouter.Handle("/swagger.yaml", http.FileServer(http.Dir("./")))
 

Из документации:

     // BasePath for the UI path, defaults to: /
    BasePath string
    // Path combines with BasePath for the full UI path, defaults to: docs
    Path string
 

Полный пример: https://play.golang.org/p/U4A60KQ0lD8

Комментарии:

1. хм, что вы пробовали? Довольно уверен, что базовый путь — это то, что вам нужно, это то, что говорится в документации (обновлено)

2. если я добавлю psthprefix и удалю префикс v1 из путей, оба обработчика api и обработчики документации не будут работать… Запрос отредактирован

Ответ №3:

Я забыл обновить спецификацию в коде, которым я поделился ранее. Для меня работает следующее. Вам понадобится развязность.файл yaml в текущем рабочем каталоге.

 
func main() {
    m := mux.NewRouter()

    v1routes := m.Methods(http.MethodGet).PathPrefix("/v1").Subrouter()

    opts := middleware.RedocOpts{SpecURL: "/v1/swagger.yaml", BasePath: "/v1"}
    sh := middleware.Redoc(opts, nil)

    v1routes.Handle("/docs", sh)
    // Assumes that the swagger file is in the current working directory and not ./v1/swagger.yaml
    v1routes.Handle("/swagger.yaml", http.StripPrefix("/v1/", http.FileServer(http.Dir("./"))))

    err := http.ListenAndServe(":8000", m)

    fmt.Println(err)
}