Cet article résume les informations permettant de générer des spécifications d'API pour les produits Gin à l'aide de la bibliothèque gin-swagger
.
lien vers le référentiel gin-swagger
Créer un dossier
//Dans n'importe quel répertoire
$ mkdir use_swagger && cd use_swagger
Initialiser go mod
$ go mod init use_swagger
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/swaggo/swag/cmd/swag
$ go get -u github.com/swaggo/gin-swagger
$ go get -u github.com/swaggo/files
Vérifiez la version une fois l'installation terminée.
$ swag -v
swag version v1.6.7
Structure de répertoire actuelle
|-- use_swagger
|-- |-- go.mod
Créez un fichier main.go
dans le répertoire ʻuse_swagger`
$ touch main.go
Avant l'ajout
main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
r.GET("/test", test)
r.Run()
}
func test(c *gin.Context){
c.JSON(http.StatusOK, gin.H{ "msg": "ok"})
}
Si vous accédez à http: // localhost: 8080 / test
après le démarrage du serveur, de simples données Json seront renvoyées.
Après l'addition
main.go
package main
import (
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
"github.com/swaggo/gin-swagger"
"net/http"
_ "use_swagger/docs"
)
// @title titre du document API
// @version version(1.0)
// @description Description des spécifications
// @Précautions lors de l'utilisation des spécifications termsOfService
// @contact.nom du supporteur de l'API
// @contact.url http://www.swagger.io/support
// @contact.email [email protected]
// @license.licence de nom(Obligatoire)
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host localhost:8080
// @BasePath /
func main() {
r := gin.New()
url := ginSwagger.URL("http://localhost:8080/swagger/doc.json")
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
r.GET("/test", test)
r.Run()
}
// @description Détails de l'API de test
// @version 1.0
// @accept application/x-json-stream
// @param none query string false "Non requis."
// @Success 200 {object} gin.H {"code":200,"msg":"ok"}
// @router /test/ [get]
func test(c *gin.Context){
c.JSON(http.StatusOK, gin.H{ "msg": "ok"})
}
Initialisez les spécifications.
$ swag init
Une fois l'initialisation terminée, la structure du répertoire est la suivante.
|-- use_swagger
|-- |-- docs
|-- |-- |-- docs.go
|-- |-- |-- swagger.json
|-- |-- |-- swagger.yaml
|-- |-- main.go
|-- |-- go.mod
Démarrez le serveur et accédez à http: // localhost: 8080 / swagger / index.html
pour afficher les spécifications.
Je vais l'utiliser, passer les paramètres de manière appropriée et l'exécuter.
J'ai eu la réponse attendue.
option | Explication |
---|---|
description | Description détaillée de l'opération. |
id | Une chaîne unique utilisée pour identifier l'opération. Doit être unique parmi toutes les opérations d'API.(Je ne vois pas grand-chose où il est utilisé) |
tags | Affiche une liste de balises et la pertinence de l'API pour chaque opération d'API, séparées par des virgules. |
summary | Un bref résumé de ce que fait l'opération. |
accept | L'API peut être utiliséeType d'en-tête MIMEListede.Lavaleurest,Typed'en-têteMIMEDoit être tel que décrit dans. |
produce | Une liste de types MIME que l'API peut générer. La valeur est,Type d'en-tête MIMEDoit être tel que décrit dans. |
param | Paramètres séparés par des espaces. Nom du paramètre, type de paramètre, type de données, requis? , Attribut de commentaire (facultatif) |
security | Sécurité de chaque opération d'API. |
success | Réponse de succès séparée par un espace. Code de réponse,{param type}, Type de données, commentaire |
failure | Réponse aux échecs séparés par des espaces. Code de réponse,{param type}, Type de données, commentaire |
router | chemin,[httpMethod] |
// @Summary Auth admin
// @Description get admin info
// @Tags accounts,admin
// @Accept application/x-json-stream
// @Produce application/x-json-stream
// @Success 200 {object} model.Admin
// @Failure 400 {object} httputil.HTTPError
// @Failure 401 {object} httputil.HTTPError
// @Failure 404 {object} httputil.HTTPError
// @Failure 500 {object} httputil.HTTPError
// @Security ApiKeyAuth
// @Router /admin/auth [post]
func (c *Controller) Auth(ctx *gin.Context) {
authHeader := ctx.GetHeader("Authorization")
if len(authHeader) == 0 {
httputil.NewError(ctx, http.StatusBadRequest, errors.New("please set Header Authorization"))
return
}
if authHeader != "admin" {
httputil.NewError(ctx, http.StatusUnauthorized, fmt.Errorf("this user isn't authorized to operation key=%s expected=admin", authHeader))
return
}
admin := model.Admin{
ID: 1,
Name: "admin",
}
ctx.JSON(http.StatusOK, admin)
}
// ShowBottle godoc
// @Summary Show a bottle
// @Description get string by ID
// @ID get-string-by-int
// @Tags bottles
// @Accept json
// @Produce json
// @Param id path int true "Bottle ID"
// @Success 200 {object} model.Bottle
// @Failure 400 {object} httputil.HTTPError
// @Failure 404 {object} httputil.HTTPError
// @Failure 500 {object} httputil.HTTPError
// @Router /bottles/{id} [get]
func (c *Controller) ShowBottle(ctx *gin.Context) {
id := ctx.Param("id")
bid, err := strconv.Atoi(id)
if err != nil {
httputil.NewError(ctx, http.StatusBadRequest, err)
return
}
bottle, err := model.BottleOne(bid)
if err != nil {
httputil.NewError(ctx, http.StatusNotFound, err)
return
}
ctx.JSON(http.StatusOK, bottle)
}
D'autres informations sur l'API sont Official Document et [This Repository](https://github.com/swaggo/swag/tree/ Veuillez vous référer à maître / exemple / celler / contrôleur).
La bibliothèque gin-swagger n'est pas très utile car il s'agit d'une spécification d'API générée à partir des commentaires. Lors de l'écriture, vous devez vous assurer qu'il n'y a pas d'erreur. : point_up_tone1: