tanukirpc é uma biblioteca rpc/roteador de desenvolvimento rápido, seguro de tipo, seguro e fácil de usar para o GO. Esta base da biblioteca no go-chi/chi .
go get -u github.com/mackee/tanukirpc Este é um exemplo simples de como 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 A injeção de registro é uma característica única do tanukirpc . Você pode injetar um objeto de registro para a função Handler.
Além disso, o registro pode ser gerado para cada solicitação. Para mais detalhes, consulte _example/simples-registry.
tanukirpc suporta as seguintes ligações de solicitação por padrão:
/entity/{id} caminho): use a tag urlparam structqueryapplication/json ): Use a tag json Structapplication/x-www-form-urlencoded ): Use a tag de estrutura de formrawbody com [] byte ou io.readcloser Se você deseja usar outras ligações, pode implementar a interface tanukirpc.Codec e especificá -la usando a opção tanukirpc.WithCodec ao inicializar o roteador.
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc validação automaticamente pelo go-playground/validator quando contém validate a tag struct na estrutura da solicitação.
type YourRequest struct {
Name string `form:"name" validate:"required"`
} Se você deseja usar a validação personalizada, pode implementar a interface tanukirpc.Validatable em sua estrutura de solicitação. tanukirpc chamará o método Validatable.Validate após vincular a solicitação e antes de chamar a função Handler.
tanukirpc possui um manipulador de erros padrão. Se você deseja usar o manuseio de erros personalizado, pode implementar a interface tanukirpc.ErrorHooker e usá -lo com a opção tanukirpc.WithErrorHooker ao inicializar o roteador.
Se você deseja retornar uma resposta com um código de status específico, pode usar o 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" ))
} Além disso, você pode usar a função tanukirpc.ErrorRedirectTo . Esta função retorna uma resposta com um código de status 3xx e um cabeçalho 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" )
} Você pode usar tanukirpc com go-chi/chi/middleware ou func (http.Handler) http.Handler estilo middlewares. Gorila/manipuladores também está incluído nisso.
Se você deseja usar o middleware, pode usar *Router.Use ou *Router.With .
tanukiup O comando tanukiup é muito útil durante o desenvolvimento. Quando você inicia seu servidor através do comando tanukiup , ele detecta alterações de arquivo, aciona uma compilação e reinicia o servidor.
Você pode usar o comando tanukiup da seguinte maneira:
$ go run github.com/mackee/tanukirpc/cmd/tanukiup -dir ./... A opção -dir especifica o diretório a ser assistido. Ao anexar ... até o final, inclui recursivamente todos os subdiretos no escopo do relógio. Se você deseja excluir determinados diretórios, use a opção -ignore-dir . Você pode especificar vários diretórios fornecendo valores separados por vírgula ou usando a opção várias vezes. Por padrão, o servidor será reiniciado quando os arquivos com a extensão .go forem atualizados.
A opção -addr permite que o comando tanukiup atue como um servidor. Depois de criar e iniciar o aplicativo do servidor criado com tanukirpc , ele proxies solicitações para esse processo. O aplicativo deve ser iniciado com *tanukirpc.Router.ListenAndServe ; Caso contrário, a opção -addr não funcionará. Somente os caminhos registrados no tanukirpc.Router serão proxiados para o aplicativo do servidor.
Além disso, existe uma opção chamada -catchall-target que pode ser usada em conjunto com -addr . Esta opção permite solicitações de proxy de caminhos que não estão registrados no tanukirpc.Router para outro endereço do servidor. Isso é particularmente útil ao trabalhar com um servidor de desenvolvimento de front -end (por exemplo, Webpack, Vite).
Além disso, ele detecta o go:generate linhas para o comando gentypescript mencionado posteriormente e as executa automaticamente antes de reiniciar.
Um servidor de aplicativos da Web usando tanukirpc pode gerar código do lado do cliente com base nas informações de tipo de cada terminal.
gentypescript gera código do lado do cliente especificamente para o TypeScript. Usando a implementação gerada do cliente, você pode enviar e receber solicitações de API com segurança de tipo para cada terminal.
Para gerar o código do cliente, primeiro ligue para genclient.AnalyzeTarget com o roteador como um argumento para definir claramente o roteador de destino.
Em seguida, adicione o seguinte: Gereate Line:
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ A opção -out especifica o nome do arquivo de saída. Além disso, anexa ./ Para especificar o pacote a ser analisado.
Quando você é executado, go generate ./ No pacote que contém esse arquivo, ou quando você inicia o servidor através do comando tanukiup acima mencionado, o código do cliente TypeScript será gerado.
Para um uso mais detalhado, consulte o diretório _example/TODO.
tanukirpc suporta ganchos de adiamento para limpeza. Você pode registrar uma função a ser chamada após a execução da função manipulada.
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 fornece utilitários convenientes para gerenciamento de sessões. Você pode usar o pacote gorilla/sessions ou outras bibliotecas de gerenciamento de sessões.
Para começar, crie uma loja de sessões e envolva -a usando 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
} No RegistryFactory , você pode criar uma sessão usando o 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
} O tipo Registry implementa a interface tanukirpc/sessions.RegistryWithAccessor .
tanukirpc suporta o fluxo de autenticação OpenID Connect. Você pode usar a função tanukirpc/auth/oidc.NewHandlers para criar manipuladores para esse fluxo, que inclui um conjunto de manipuladores para facilitar a autenticação do usuário.
tanukirpc/auth/oidc.Handlers requer um Registry que implemente a interface tanukirpc/sessions.RegistryWithAccessor . Para mais detalhes, consulte a seção de gerenciamento de sessões.
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 sob licença do MIT.