tanukirpc es una biblioteca RPC/enrutador práctica, de desarrollo rápido, seguro y fácil de usar para GO. Esta base de la biblioteca en go-chi/chi .
go get -u github.com/mackee/tanukirpc Este es un ejemplo simple de cómo usar 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 La inyección de registro es una característica única de tanukirpc . Puede inyectar un objeto de registro a la función del controlador.
Además, el registro se puede generar para cada solicitud. Para obtener más detalles, consulte _example/simple registro.
tanukirpc admite los siguientes enlaces de solicitud de forma predeterminada:
/entity/{id} ruta): use la etiqueta de estructura urlparamqueryapplication/json ): use la etiqueta json Structapplication/x-www-form-urlencoded ): use la etiqueta de struct formrawbody con [] byte o io.readcloser Si desea usar otras enlaces, puede implementar la interfaz tanukirpc.Codec y especificarlo utilizando la opción tanukirpc.WithCodec al inicializar el enrutador.
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc Validación automáticamente por go-playground/validator cuando contiene una etiqueta de struct validate en la estructura de solicitud.
type YourRequest struct {
Name string `form:"name" validate:"required"`
} Si desea utilizar la validación personalizada, puede implementar la interfaz tanukirpc.Validatable en su estructura de solicitud. tanukirpc llamará al método Validatable.Validate después de vincular la solicitud y antes de llamar a la función del controlador.
tanukirpc tiene un controlador de error predeterminado. Si desea utilizar el manejo de errores personalizados, puede implementar la interfaz tanukirpc.ErrorHooker y usarlo con la opción tanukirpc.WithErrorHooker al inicializar el enrutador.
Si desea devolver una respuesta con un código de estado específico, puede usar el 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" ))
} Además, puede usar la función tanukirpc.ErrorRedirectTo . Esta función devuelve una respuesta con un código de estado 3xx y un encabezado 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" )
} Puede usar tanukirpc con Go-chi/chi/middleware o func (http.Handler) http.Handler Style MiddleWares. Gorilla/Handlers también se incluye en esto.
Si desea usar el middleware, puede usar *Router.Use o *Router.With .
tanukiup El comando tanukiup es muy útil durante el desarrollo. Cuando inicia su servidor a través del comando tanukiup , detecta los cambios de archivo, desencadena una compilación y reinicia el servidor.
Puedes usar el comando tanukiup de la siguiente manera:
$ go run github.com/mackee/tanukirpc/cmd/tanukiup -dir ./... La opción -dir especifica el directorio a ver. Al agregar ... hasta el final, incluye recursivamente todos los subdirectorios en el alcance del reloj. Si desea excluir ciertos directorios, use la opción -ignore-dir . Puede especificar múltiples directorios proporcionando valores separados por comas o utilizando la opción varias veces. Por defecto, el servidor se reiniciará cuando los archivos con la extensión .go se actualicen.
La opción -addr permite que el comando tanukiup actúe como un servidor en sí. Después de construir e iniciar la aplicación del servidor creada con tanukirpc , las solicitudes de representación de TI a este proceso. La aplicación debe iniciarse con *tanukirpc.Router.ListenAndServe ; De lo contrario, la opción -addr no funcionará. Solo las rutas registradas con tanukirpc.Router se representarán en la aplicación del servidor.
Además, hay una opción llamada -catchall-target que se puede usar junto con -addr . Esta opción le permite solicitar solicitudes de rutas que no están registradas en tanukirpc.Router a otra dirección del servidor. Esto es particularmente útil cuando se trabaja con un servidor de desarrollo frontend (por ejemplo, Webpack, VITE).
Además, detecta el go:generate líneas para el comando gentypescript mencionado más tarde, y automáticamente las ejecuta antes de reiniciarlas.
Un servidor de aplicaciones web que usa tanukirpc puede generar código del lado del cliente basado en la información de tipo de cada punto final.
gentypescript genera código del lado del cliente específicamente para TypeScript. Al usar la implementación del cliente generada, puede enviar y recibir solicitudes de API con seguridad de tipo para cada punto final.
Para generar el código del cliente, primero llame genclient.AnalyzeTarget con el enrutador como un argumento para definir claramente el enrutador objetivo.
A continuación, agregue lo siguiente: Genere la línea:
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ La opción -out especifica el nombre del archivo de salida. Además, agregue ./ Para especificar el paquete que se analizará.
Cuando ejecuta go generate ./ En el paquete que contiene este archivo, o cuando inicia el servidor a través del comando tanukiup mencionado anteriormente, se generará el código del cliente TypeScript.
Para un uso más detallado, consulte el directorio _example/TODO.
tanukirpc admite los ganchos de diferencias para la limpieza. Puede registrar una función que se llamará después de que se haya ejecutado la función del controlador.
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 proporciona servicios públicos convenientes para la gestión de sesiones. Puede usar el paquete gorilla/sessions u otras bibliotecas de administración de sesiones.
Para comenzar, cree un almacén de sesión y envuélvelo con 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
} En RegistryFactory , puede crear una sesión utilizando 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
} El tipo Registry implementa la interfaz tanukirpc/sessions.RegistryWithAccessor .
tanukirpc admite el flujo de autenticación de OpenID Connect. Puede usar la función tanukirpc/auth/oidc.NewHandlers para crear controladores para este flujo, que incluye un conjunto de controladores para facilitar la autenticación del usuario.
tanukirpc/auth/oidc.Handlers requiere un Registry que implementa la interfaz tanukirpc/sessions.RegistryWithAccessor . Para obtener más detalles, consulte la sección de gestión de sesiones.
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
Licenciado bajo licencia MIT.