Générer des spécifications d'API à l'aide de GO / Gingin-swagger

Préface

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 swagger-banner.png

Créer un produit à tester

Créer un dossier

//Dans n'importe quel répertoire
$ mkdir use_swagger && cd use_swagger

Initialiser go mod

$ go mod init use_swagger

Installation de la bibliothèque

$ 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

Spécifications API ajoutées au produit

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. キャプチャ.PNG

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. キャプチャ.PNG Je vais l'utiliser, passer les paramètres de manière appropriée et l'exécuter. キャプチャ.PNG J'ai eu la réponse attendue. キャプチャ.PNG

Options couramment utilisées

Options API

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]

Légende d'utilisation

// @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).

Impressions d'utilisation

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:

Recommended Posts

Générer des spécifications d'API à l'aide de GO / Gingin-swagger
Défi pour générer des en-têtes Yahoo! News en utilisant uniquement l'API COTOHA
[Go language] Collectez et enregistrez des images Vtuber à l'aide de l'API Twitter