tanukirpc ist eine praktische, sich schnell entwickelnde, typfreie und benutzerfreundliche RPC/Router-Bibliothek für GO. Diese Bibliotheksbasis auf go-chi/chi .
go get -u github.com/mackee/tanukirpc Dies ist ein einfaches Beispiel für die Verwendung 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 Die Registrierungsinjektion ist ein einzigartiges Merkmal von tanukirpc . Sie können der Handler -Funktion ein Registrierungsobjekt injizieren.
Zusätzlich kann für jede Anfrage eine Registrierung generiert werden. Weitere Informationen finden Sie unter _example/Simple-Registry.
tanukirpc unterstützt standardmäßig die folgenden Anforderungsbindungen:
/entity/{id} urlparamquery -Tagapplication/json ): Verwenden Sie das json -Struktur -Tagapplication/x-www-form-urlencoded ): Verwenden Sie das form Struct-Tagrawbody Struct -Tag mit [] Byte oder io.readcloser Wenn Sie andere Bindungen verwenden möchten, können Sie die Schnittstelle tanukirpc.Codec implementieren und mit der Option tanukirpc.WithCodec beim Initialisieren des Routers angeben.
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc Validierung automatisch nach go-playground/validator wenn es in Request Struct validate .
type YourRequest struct {
Name string `form:"name" validate:"required"`
} Wenn Sie eine benutzerdefinierte Validierung verwenden möchten, können Sie die Schnittstelle tanukirpc.Validatable in Ihrer Anforderungsstruktur implementieren. tanukirpc ruft die Validatable.Validate Methode auf.
tanukirpc hat einen Standardfehlerhandler. Wenn Sie die benutzerdefinierte Fehlerbehandlung verwenden möchten, können Sie die Schnittstelle tanukirpc.ErrorHooker implementieren und diese mit der Option tanukirpc.WithErrorHooker beim Initialisieren des Routers verwenden.
Wenn Sie eine Antwort mit einem bestimmten Statuscode zurückgeben möchten, können Sie den tanukirpc.WrapErrorWithStatus verwenden.
// 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" ))
} Außerdem können Sie die Funktion tanukirpc.ErrorRedirectTo verwenden. Diese Funktion gibt eine Antwort mit einem 3xx -Statuscode und einem Location -Header zurück.
// this handler returns a 301 status code
func redirectHandler ( ctx tanukirpc. Context [ struct {}], struct {}) ( * struct {}, error ) {
return nil , tanukirpc . ErrorRedirectTo ( http . StatusMovedPermanently , "/new-location" )
} Sie können tanukirpc mit Go-Chi/Chi/Middleware oder func (http.Handler) http.Handler -Style Middlewares verwenden. Gorilla/Handler sind auch darin enthalten.
Wenn Sie Middleware verwenden möchten, können Sie *Router.Use oder *Router.With verwenden.
tanukiup -Befehl Das tanukiup -Befehl ist während der Entwicklung sehr nützlich. Wenn Sie Ihren Server über den Befehl tanukiup starten, erkennt er Dateiänderungen, löst einen Build aus und startet den Server neu.
Sie können den Befehl tanukiup wie folgt verwenden:
$ go run github.com/mackee/tanukirpc/cmd/tanukiup -dir ./... Die Option -dir gibt das zu beobachtete Verzeichnis an. Durch Anhängen ... bis zum Ende enthält es rekursiv alle Unterverzeichnisse in den Watch -Bereich. Wenn Sie bestimmte Verzeichnisse ausschließen möchten, verwenden Sie die Option -ignore-dir . Sie können mehrere Verzeichnisse angeben, indem Sie mit Kommas getrennte Werte oder mehrmals die Option verwenden. Standardmäßig wird der Server neu gestartet, wenn Dateien mit der .go -Erweiterung aktualisiert werden.
Mit der Option -addr kann der Befehl tanukiup als Server selbst fungieren. Nach dem Erstellen und Starten der mit tanukirpc erstellten Serveranwendung stellten sie Proxies -Anforderungen für diesen Prozess. Die Anwendung muss mit *tanukirpc.Router.ListenAndServe gestartet werden; Andernfalls funktioniert die Option -addr nicht. Nur die bei tanukirpc.Router registrierten Pfade werden in die Serveranwendung verfolgt.
Zusätzlich gibt es eine Option namens -catchall-target , die in Verbindung mit -addr verwendet werden kann. Mit dieser Option können Sie Proxy -Anforderungen für Pfade, die nicht bei tanukirpc.Router an einer anderen Serveradresse registriert sind, registriert werden. Dies ist besonders nützlich, wenn Sie mit einem Frontend Development Server (z. B. Webpack, Vite) arbeiten.
Darüber hinaus erkennt es das später erwähnte GentyPescript -Befehl zum go:generate Zeilen für den Befehl gentypescript und werden automatisch vor dem Neustart ausgeführt.
Ein Webanwendungsserver, der tanukirpc verwendet, kann einen clientseitigen Code basierend auf den Typinformationen jedes Endpunkts generieren.
gentypescript generiert den Client-Seite-Code speziell für Typscript. Durch die Verwendung der generierten Client -Implementierung können Sie für jeden Endpunkt API -Anfragen mit Type Sicherheit senden und empfangen.
Um den Client -Code zu generieren, rufen Sie zuerst genclient.AnalyzeTarget mit dem Router als Argument zur klar definierten Zielrouter auf.
Fügen Sie als nächstes Folgendes hinzu: Zeile erzeugen:
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ Die Option -out gibt den Namen Ausgabedatei an. Zusätzlich append ./ um das zu analysierende Paket anzugeben.
Wenn Sie go generate ./ In dem Paket, das diese Datei enthält, oder wenn Sie den Server über den oben genannten Befehl tanukiup starten, wird der TypeScript -Client -Code generiert.
Eine detailliertere Verwendung finden Sie im Verzeichnis _example/tODO.
tanukirpc unterstützt die Aufräumung von Haken. Sie können eine Funktion registrieren, die aufgerufen werden soll, nachdem die Handler -Funktion ausgeführt wurde.
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 bietet bequeme Dienstprogramme für das Sitzungsmanagement. Sie können das gorilla/sessions -Paket oder andere Sitzungsverwaltungsbibliotheken verwenden.
Erstellen Sie, um einen Session Store zu erstellen, und wickeln Sie es mit tanukirpc/auth/gorilla.NewStore ein.
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
} In RegistryFactory können Sie eine Sitzung mit den tanukirpc/sessions.Store erstellen.
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
} Der Registry implementiert die tanukirpc/sessions.RegistryWithAccessor . Registry withAccessor -Schnittstelle.
tanukirpc unterstützt den OpenID -Anschluss -Authentifizierungsfluss. Sie können die Funktion tanukirpc/auth/oidc.NewHandlers verwenden, um Handler für diesen Fluss zu erstellen, der eine Reihe von Handlern enthält, um die Benutzerauthentifizierung zu erleichtern.
tanukirpc/auth/oidc.Handlers erfordert eine Registry , die die tanukirpc/sessions.RegistryWithAccessor implementiert. Weitere Informationen finden Sie im Abschnitt "Sitzungsmanagement".
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
Lizenziert unter MIT -Lizenz.