paint-brush
Construire un service d'API RESTful dans Go sans avoir de modèle répétitifpar@ichebykin
1,140 lectures
1,140 lectures

Construire un service d'API RESTful dans Go sans avoir de modèle répétitif

par Mify6m2023/03/06
Read on Terminal Reader

Trop long; Pour lire

Nous écrivons des services depuis un certain temps et le plus souvent, vous voudriez simplement ignorer tout ce processus fastidieux de collage d'éléments et simplement écrire du code utile, nous avons donc créé Mify - un générateur de passe-partout d'infrastructure open source. Dans ce didacticiel, nous montrerons comment créer un service simple à l'aide de Mify avec un exemple classique - une application de tâches.
featured image - Construire un service d'API RESTful dans Go sans avoir de modèle répétitif
Mify HackerNoon profile picture



Il existe de nombreux documents sur la façon d'écrire des services, où vous devez d'abord choisir un cadre à utiliser, puis vient le câblage des gestionnaires, des configurations, des journaux, du stockage, etc., sans parler du déploiement de ce service quelque part. Nous écrivons des services depuis un certain temps et le plus souvent, vous voudriez simplement ignorer tout ce processus fastidieux de collage d'éléments et simplement écrire du code utile.


C'est pourquoi nous avons créé un outil, appelé Mify - c'est un générateur de passe-partout d'infrastructure open source, qui vous aiderait à créer un service, en prenant les meilleures pratiques utilisées à ce jour. Ainsi, dans ce didacticiel, nous montrerons comment créer un service simple à l'aide de Mify avec un exemple classique - une application de tâches.

Conditions préalables

Avant de commencer ce tutoriel, voici le lien vers l'exemple complet : https://github.com/mify-io/todo-app-example

Création d'un projet

Après avoir installé Mify, pour démarrer le projet, vous devez créer l'espace de travail :

 $ mify init todo-app $ cd todo-app


Après être entré dans le nouvel espace de travail, exécutez :

 $ mify add service todo-backend


Maintenant, cela créera un modèle Go pour votre backend de tâches. Voici une arborescence simplifiée de l'espace de travail avec tous les fichiers générés :

 . ├── go-services │ ├── cmd │ │ ├── dev-runner │ │ │ └── main.go │ │ └── todo-backend │ │ ├── Dockerfile │ │ └── main.go │ ├── go.mod │ ├── go.sum │ └── internal │ ├── pkg │ │ └── generated │ │ ├── configs │ │ │ └── ... │ │ ├── consul │ │ │ └── ... │ │ ├── logs │ │ │ └── ... │ │ └── metrics │ │ └── ... │ └── todo-backend │ ├── app │ │ ├── request_extra.go │ │ ├── router │ │ │ └── router.go │ │ └── service_extra.go │ └── generated │ ├── api | | └── ... │ ├── app │ │ └── ... │ ├── apputil │ │ └── ... │ └── core │ └── ... ├── schemas │ └── todo-backend │ ├── api │ │ └── api.yaml │ └── service.mify.yaml └── workspace.mify.yaml


Mify suit vaguement l'une des dispositions Go courantes, qui convient à plusieurs services dans un référentiel. Dans internal/pkg/generated il existe des bibliothèques communes pour les configurations, les journaux et les métriques qui peuvent être réutilisées pour plusieurs services. Votre répertoire de service se trouve dans internal/todo-backend .

À ce stade, ce service est assez simple, nous devons donc lui ajouter une API.

Définition de l'API

Vous pouvez trouver le schéma OpenAPI pour le todo-backend dans le fichier schemas/todo-backend/api/api.yaml . Le répertoire Schemas à la racine de l'espace de travail est un endroit où toutes les configurations de service liées à Mify sont stockées.


Créons une API CRUD simple pour votre backend todo :

  • POST /todos pour ajouter de nouvelles notes de tâches.
  • PUT,GET,DELETE /todos/{id} pour les mettre à jour, les récupérer et les supprimer.

Voici à quoi ressemblerait votre schéma OpenAPI pour cette API :

https://gist.github.com/chebykinn/5dc7b30a2a57a1ab4584895131295e1f

Remplacez le schéma précédent par celui-ci et exécutez mify generate . Vous pouvez l'exécuter chaque fois que vous mettez à jour le schéma et il régénérera tous les éléments modifiés.

Construire et tester

 $ cd go-services $ go mod tidy $ go run ./cmd/todo-backend


Vous devriez voir des journaux de démarrage comme celui-ci :

Vous pouvez voir le port de service dans le message starting api server , le copier dans Postman et essayer d'appeler un gestionnaire d'API :

Vous pouvez voir que le gestionnaire n'a rien renvoyé, ce qui est attendu car, comme le suggère l'erreur, il n'est pas encore implémenté.

Ajout de modèles et de stockage fictif

Tout d'abord, nous devons créer un modèle pour la todo note, nous le mettrons dans le package domain

dans go-services/internal/todo-backend/domain/todo.go :

C'est également un bon endroit pour définir l'interface de stockage, ce qui est utile pour découpler la logique de persistance de l'application. Dans ce didacticiel, nous utiliserons un stockage fictif, en mémoire, mais Mify prend également en charge Postgres, que nous pourrons ajouter plus tard dans un article de suivi. Mettons le stockage dans go-services/internal/todo-backend/storage/todo_mem.go:

C'est tout pour la logique, nous avons juste besoin de l'ajouter aux gestionnaires.

Implémentation des gestionnaires

go-services/internal/todo-backend/handlers/todos/service.go pour la méthode POST, et

go-services/internal/todo-backend/handlers/todos/id/service.go pour les autres.

Voici un exemple de stub de la méthode POST :

Maintenant, implémentons tous les gestionnaires.

go-services/internal/todo-backend/handlers/todos/service.go :

N'oubliez pas de mettre à jour les importations :

 import ( "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" )


go-services/internal/todo-backend/handlers/todos/id/service.go :

Et voici les importations pour eux aussi :

 import ( "errors" "fmt" "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" "example.com/namespace/todo-app/go-services/internal/todo-backend/storage" )


La logique du gestionnaire est assez simple, nous convertissons simplement les modèles OpenAPI générés vers notre application un et inversement, et pour éviter la duplication dans le code, voici une aide pour créer une réponse TodoNode, qui est utilisée dans ces implémentations :

go-services/internal/todo-backend/handlers/common.go :

Tester à nouveau

Tout d'abord, nous pouvons ajouter une nouvelle todo note avec une requête POST :

Vérifiez s'il est ajouté avec une requête GET :

Mettez-le à jour avec une requête PUT :

Supprime-le:

Et exécutez à nouveau GET pour vérifier s'il a été supprimé :

Et après

  • Stockage persistant, comme Postgres,

  • Configuration,

  • Intergiciel d'authentification,

  • Déploiement dans le cloud.


La plupart de ces choses sont couvertes dans nos documents, alors consultez-les : https://mify.io/docs , mais restez à l'écoute pour les prochains articles.


Également publié ici