golang提供Swagger JSON文档服务的预编译UI插件库go-swagger-ui的使用
go-swagger-ui 使用指南
go-swagger-ui 是一个用于提供 Swagger JSON 文档和 Swagger UI 界面的 Golang 处理器库,通常与 grpc-gateway 编译的 Swagger 文档一起使用。
基本用法
import (
"github.com/esurdam/go-swagger-ui"
)
// Asset 代表一个 AssetFn - 编译后的 bindata swagger 文件
mux := swaggerui.NewServeMux(Asset, "swagger.json") // 添加 swagger bindata 资源
// /swagger.json 提供 JSON 文档
// /swagger-ui 提供 Swagger UI 界面
自定义根路径
import (
"github.com/esurdam/go-swagger-ui"
)
// Asset 代表一个 AssetFn - 编译后的 bindata swagger 文件
mux := swaggerui.NewServeMuxWithRoot(Asset, "swagger.json", "/v1/auth") // 添加 swagger bindata 资源
// v1/auth/swagger.json 提供 JSON 文档
// v1/auth/swagger-ui 提供 Swagger UI 界面
更新 UI
swagger
目录包含自动生成的输出:
- 将更新的资源添加到
//third_party/swagger-ui
- 运行
make build
命令,该命令会将 Swagger 编译到swagger/bindata.go
完整示例
下面是一个完整的示例,展示如何使用 go-swagger-ui:
package main
import (
"log"
"net/http"
"github.com/esurdam/go-swagger-ui"
)
// 假设这是通过 go-bindata 生成的 Asset 函数
// 实际使用时需要替换为真实的 bindata 函数
func Asset(name string) ([]byte, error) {
return []byte{}, nil
}
func main() {
// 创建默认路由的 Swagger UI 处理器
mux := swaggerui.NewServeMux(Asset, "swagger.json")
// 或者创建自定义根路径的处理器
// mux := swaggerui.NewServeMuxWithRoot(Asset, "swagger.json", "/api/docs")
// 创建 HTTP 服务器
server := &http.Server{
Addr: ":8080",
Handler: mux,
}
// 启动服务器
log.Println("Swagger UI 服务启动,访问 http://localhost:8080/swagger-ui")
log.Fatal(server.ListenAndServe())
}
注意事项
- 使用前需要确保已经通过 go-bindata 或其他工具将 Swagger UI 资源编译为 Go 代码
- 需要提供有效的 swagger.json 文件路径或内容
- 可以通过自定义根路径来避免与其他路由冲突
这个库提供了一种简单的方式来在 Golang 应用中集成 Swagger UI,方便 API 文档的查看和测试。
更多关于golang提供Swagger JSON文档服务的预编译UI插件库go-swagger-ui的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang提供Swagger JSON文档服务的预编译UI插件库go-swagger-ui的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用go-swagger-ui提供Swagger UI服务
go-swagger-ui是一个Go语言的库,它允许你将Swagger UI作为预编译的资源嵌入到你的Go应用中,无需额外安装或配置Swagger UI服务。
安装
首先安装go-swagger-ui库:
go get github.com/swaggest/swgui
基本使用
下面是一个简单的示例,展示如何使用go-swagger-ui提供Swagger UI界面:
package main
import (
"log"
"net/http"
"github.com/swaggest/swgui/v5emb"
)
func main() {
// 创建Swagger UI处理器
swaggerUIHandler := v5emb.New(
"My API", // 标题
"/swagger.json", // Swagger JSON文件路径
"/", // 基础路径
)
// 设置路由
http.Handle("/swagger/", http.StripPrefix("/swagger", swaggerUIHandler))
// 模拟提供一个Swagger JSON文件
http.HandleFunc("/swagger.json", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_, _ = w.Write([]byte(`{
"openapi": "3.0.0",
"info": {
"title": "Sample API",
"version": "1.0.0"
},
"paths": {
"/ping": {
"get": {
"responses": {
"200": {
"description": "OK",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
}
}
}
}
}
}`))
})
log.Println("Server started at http://localhost:8080/swagger/")
log.Fatal(http.ListenAndServe(":8080", nil))
}
与Swag库集成
如果你使用swag库生成Swagger文档,可以这样集成:
package main
import (
"log"
"net/http"
"github.com/swaggest/swgui/v5emb"
"github.com/swaggo/http-swagger"
)
// @title Sample API
// @version 1.0
// @description This is a sample server.
func main() {
// 使用http-swagger提供Swagger JSON
http.Handle("/swagger/", http.StripPrefix("/swagger", v5emb.New(
"Sample API",
"/swagger/doc.json",
"/",
)))
// 使用http-swagger提供Swagger JSON
http.Handle("/swagger/doc.json", httpSwagger.Handler(
httpSwagger.URL("/swagger/doc.json"), // 指向自身的URL
))
log.Println("Server started at http://localhost:8080/swagger/")
log.Fatal(http.ListenAndServe(":8080", nil))
}
高级配置
go-swagger-ui提供了一些配置选项:
handler := v5emb.New(
"My API",
"/swagger.json",
"/api",
v5emb.WithBasePath("/api"), // 设置基础路径
v5emb.WithTitle("Custom API Title"), // 自定义标题
v5emb.WithOAuthClientID("your-client-id"), // OAuth配置
v5emb.WithPersistAuthorization(true), // 保持授权信息
)
使用自定义主题
你可以自定义Swagger UI的主题:
handler := v5emb.New(
"My API",
"/swagger.json",
"/",
v5emb.WithTheme("dark"), // 使用暗色主题
// 或者
v5emb.WithCustomCSS(`
.swagger-ui .topbar { background-color: #ff0000; }
`),
)
在生产环境中的建议
- 考虑在生产环境中添加认证中间件,限制对Swagger UI的访问
- 可以只在开发环境启用Swagger UI
- 使用HTTPS保护API文档
// 添加基本认证中间件
func basicAuth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user, pass, ok := r.BasicAuth()
if !ok || user != "admin" || pass != "secret" {
w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`)
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
// 使用
http.Handle("/swagger/", basicAuth(http.StripPrefix("/swagger", swaggerUIHandler)))
go-swagger-ui是一个轻量级的解决方案,可以方便地将Swagger UI集成到你的Go应用中,特别适合需要自托管API文档的场景。