tanukirpc est une bibliothèque RPC / routeur de type développement rapide, de type rapide et facile à utiliser pour GO. Cette bibliothèque bascule sur go-chi/chi .
go get -u github.com/mackee/tanukirpc Ceci est un exemple simple de la façon d'utiliser tanukirpc .
package main
import (
"fmt"
"net/http"
"github.com/mackee/tanukirpc"
)
type helloRequest struct {
Name string `urlparam:"name"`
}
type helloResponse struct {
Message string `json:"message"`
}
func hello ( ctx tanukirpc. Context [ struct {}], req helloRequest ) ( * helloResponse , error ) {
return & helloResponse {
Message : fmt . Sprintf ( "Hello, %s!" , req . Name ),
}, nil
}
func main () {
r := tanukirpc . NewRouter ( struct {}{})
r . Get ( "/hello/{name}" , tanukirpc . NewHandler ( hello ))
if err := r . ListenAndServe ( context . Background (), ":8080" ); err != nil {
fmt . Println ( err )
}
}tanukiupgentypescript L'injection de registre est une caractéristique unique de tanukirpc . Vous pouvez injecter un objet de registre à la fonction Handler.
De plus, le registre peut être généré pour chaque demande. Pour plus de détails, veuillez vous référer à _Example / Simple-Registry.
tanukirpc prend en charge les liaisons de demande suivantes par défaut:
/entity/{id} Chemin): Utilisez la balise urlparam Structqueryapplication/json ): Utilisez la balise json Structapplication/x-www-form-urlencoded ): utilisez la balise form de formulairerawbody avec [] octet ou io.readcloser Si vous souhaitez utiliser d'autres liaisons, vous pouvez implémenter l'interface tanukirpc.Codec et le spécifier à l'aide de l'option tanukirpc.WithCodec lors de l'initialisation du routeur.
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc validation automatiquement par go-playground/validator lorsque contient validate la balise struct dans la structure de la demande.
type YourRequest struct {
Name string `form:"name" validate:"required"`
} Si vous souhaitez utiliser la validation personnalisée, vous pouvez implémenter l'interface tanukirpc.Validatable dans votre structure de demande. tanukirpc appellera la méthode Validatable.Validate après avoir lié la demande et avant d'appeler la fonction de gestionnaire.
tanukirpc a un gestionnaire d'erreur par défaut. Si vous souhaitez utiliser une gestion des erreurs personnalisée, vous pouvez implémenter l'interface tanukirpc.ErrorHooker et l'utiliser avec l'option tanukirpc.WithErrorHooker lors de l'initialisation du routeur.
Si vous souhaitez renvoyer une réponse avec un code d'état spécifique, vous pouvez utiliser le tanukirpc.WrapErrorWithStatus .
// this handler returns a 404 status code
func notFoundHandler ( ctx tanukirpc. Context [ struct {}], struct {}) ( * struct {}, error ) {
return nil , tanukirpc . WrapErrorWithStatus ( http . StatusNotFound , errors . New ( "not found" ))
} En outre, vous pouvez utiliser la fonction tanukirpc.ErrorRedirectTo . Cette fonction renvoie une réponse avec un code d'état 3xx et un en-tête Location .
// this handler returns a 301 status code
func redirectHandler ( ctx tanukirpc. Context [ struct {}], struct {}) ( * struct {}, error ) {
return nil , tanukirpc . ErrorRedirectTo ( http . StatusMovedPermanently , "/new-location" )
} Vous pouvez utiliser tanukirpc avec go-chi / chi / middleware ou func (http.Handler) http.Handler style Middlewares. Gorilla / Handlers est également inclus dans cela.
Si vous souhaitez utiliser Middleware, vous pouvez utiliser *Router.Use ou *Router.With . avec.
tanukiup La commande tanukiup est très utile pendant le développement. Lorsque vous démarrez votre serveur via la commande tanukiup , il détecte les modifications de fichiers, déclenche une version et redémarre le serveur.
Vous pouvez utiliser la commande tanukiup comme suit:
$ go run github.com/mackee/tanukirpc/cmd/tanukiup -dir ./... L'option -dir spécifie le répertoire à surveiller. En ajoutant ... jusqu'à la fin, il comprend récursivement toutes les sous-répertoires de la portée de la montre. Si vous souhaitez exclure certains répertoires, utilisez l'option -ignore-dir . Vous pouvez spécifier plusieurs répertoires en fournissant des valeurs séparées par des virgules ou en utilisant plusieurs fois l'option. Par défaut, le serveur redémarrera lorsque les fichiers avec l'extension .go sont mis à jour.
L'option -addr permet à la commande tanukiup d'agir en tant que serveur lui-même. Après avoir créé et démarré l'application du serveur créé avec tanukirpc , il indique aux demandes de ce processus. La demande doit être démarrée avec *tanukirpc.Router.ListenAndServe ; Sinon, l'option -addr ne fonctionnera pas. Seuls les chemins enregistrés auprès de tanukirpc.Router seront proxés à l'application du serveur.
De plus, il existe une option appelée -catchall-target qui peut être utilisée en conjonction avec -addr . Cette option vous permet de proxy les demandes de chemins qui ne sont pas enregistrées auprès de tanukirpc.Router . Ceci est particulièrement utile lorsque vous travaillez avec un serveur de développement frontal (par exemple, WebPack, Vite).
De plus, il détecte les lignes go:generate pour la commande gentypescript mentionnée plus loin et les exécute automatiquement avant le redémarrage.
Un serveur d'applications Web utilisant tanukirpc peut générer du code côté client basé sur les informations de type de chaque point de terminaison.
gentypescript génère du code côté client spécifiquement pour TypeScript. En utilisant l'implémentation du client généré, vous pouvez envoyer et recevoir des demandes d'API avec la sécurité de type pour chaque point de terminaison.
Pour générer le code client, appelez d'abord genclient.AnalyzeTarget avec le routeur comme argument pour définir clairement le routeur cible.
Ensuite, ajoutez le rendez-vous suivant: Générez la ligne:
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ L'option -out spécifie le nom du fichier de sortie. De plus, appelez ./ Pour spécifier le package à analyser.
Lorsque vous exécutez, go generate ./ Dans le package contenant ce fichier, ou lorsque vous démarrez le serveur via la commande tanukiup susmentionnée, le code client TypeScript sera généré.
Pour une utilisation plus détaillée, reportez-vous au répertoire _Example / TODO.
tanukirpc prend en charge les crochets de différence pour le nettoyage. Vous pouvez enregistrer une fonction à appeler une fois la fonction de gestionnaire exécutée.
func ( ctx * tanukirpc. Context [ struct {}], struct {}) ( * struct {}, error ) {
ctx . Defer ( func () error {
// Close the database connection, release resources, logging, enqueue job etc...
})
return & struct {}{}, nil
} tanukirpc fournit des services publics pratiques pour la gestion des sessions. Vous pouvez utiliser le package gorilla/sessions ou d'autres bibliothèques de gestion de session.
Pour commencer, créez un magasin de session et enveloppez-le à l'aide de tanukirpc/auth/gorilla.NewStore .
import (
"github.com/gorilla/sessions"
"github.com/mackee/tanukirpc/sessions/gorilla"
tsessions "github.com/mackee/tanukirpc/sessions"
)
func newStore ( secrets [] byte ) (tsessions. Store , error ) {
sessionStore := sessions . NewCookieStore ( secrets )
store , err := gorilla . NewStore ( sessionStore )
if err != nil {
return nil , err
}
return store , nil
} Dans RegistryFactory , vous pouvez créer une session à l'aide du tanukirpc/sessions.Store .
type RegistryFactory struct {
Store tsessions. Store
}
type Registry struct {
sessionAccessor tsessions. Accessor
}
func ( r * RegistryFactory ) NewRegistry ( w http. ResponseWriter , req * http. Request ) ( * Registry , error ) {
accessor , err := r . Store . GetAccessor ( req )
if err != nil {
return nil , fmt . Errorf ( "failed to get session accessor: %w" , err )
}
return & Registry {
sessionAccessor : accessor ,
}, nil
}
func ( r * Registry ) Session () tsessions. Accessor {
return r . sessionAccessor
} Le type Registry implémente l'interface tanukirpc/sessions.RegistryWithAccessor .
tanukirpc prend en charge le flux d'authentification OpenID Connect. Vous pouvez utiliser la fonction tanukirpc/auth/oidc.NewHandlers pour créer des gestionnaires pour ce flux, qui comprend un ensemble de gestionnaires pour faciliter l'authentification des utilisateurs.
tanukirpc/auth/oidc.Handlers nécessite un Registry qui implémente l'interface tanukirpc/sessions.RegistryWithAccessor . Pour plus de détails, reportez-vous à la section de gestion de session.
oidcAuth := oidc . NewHandlers (
oauth2Config , // *golang.org/x/oauth2.Config
provider , // *github.com/coreos/go-oidc/v3/oidc.Provider
)
router . Route ( "/auth" , func ( router * tanukirpc. Router [ * Registry ]) {
router . Get ( "/redirect" , tanukirpc . NewHandler ( oidcAuth . Redirect ))
router . Get ( "/callback" , tanukirpc . NewHandler ( oidcAuth . Callback ))
router . Get ( "/logout" , tanukirpc . NewHandler ( oidcAuth . Logout ))
})Copyright (C) 2024- Mackee
Licencié sous licence MIT.