#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
? Для обработчика api2.
/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)
}