tanukirpc是一个实用,快速开发,类型安全且易于使用的RPC/Router库,用于GO。该图书馆基于go-chi/chi 。
go get -u github.com/mackee/tanukirpc这是如何使用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 )
}
}tanukiup命令gentypescript命令注册注射是tanukirpc的独特特征。您可以将注册表对象注入处理程序功能。
此外,可以为每个请求生成注册表。有关更多详细信息,请参阅_example/Simple-Registry。
默认情况下, tanukirpc支持以下请求绑定:
/entity/{id}路径):使用urlparam struct标签query结构标签application/json ):使用json结构标签application/x-www-form-urlencoded ):使用form结构标签rawbody struct标签如果要使用其他绑定,则可以实现tanukirpc.Codec接口,并在初始化路由器时使用tanukirpc.WithCodec进行指定。
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec ))tanukirpc在Request Strate中包含validate struct标签时,通过go-playground/validator自动验证。
type YourRequest struct {
Name string `form:"name" validate:"required"`
}如果要使用自定义验证,则可以在请求结构中实现tanukirpc.Validatable接口。 tanukirpc将在绑定请求后和调用处理程序函数之前调用Validatable.Validate方法。
tanukirpc具有默认错误处理程序。如果要使用自定义错误处理,则可以实现tanukirpc.ErrorHooker接口,并在初始化路由器时将其与tanukirpc.WithErrorHooker选项一起使用。
如果要返回具有特定状态代码的响应,则可以使用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" ))
}另外,您可以使用tanukirpc.ErrorRedirectTo功能。此功能返回带有3XX状态代码和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" )
}您可以将tanukirpc与go-chi/chi/middleware或func (http.Handler) http.Handler Style Middlewares一起使用。大猩猩/处理程序也包括在其中。
如果要使用中间件,则可以使用*Router.Use或*Router.With 。
tanukiup命令tanukiup命令在开发过程中非常有用。当您通过tanukiup命令启动服务器时,它会检测文件更改,触发构建并重新启动服务器。
您可以使用tanukiup :
$ go run github.com/mackee/tanukirpc/cmd/tanukiup -dir ./... -dir选项指定要观看的目录。通过附加...到最后,它递归地包括手表范围中的所有子目录。如果要排除某些目录,请使用-ignore-dir选项。您可以通过提供逗号分隔值或多次使用选项来指定多个目录。默认情况下,当更新带有.go扩展名的文件时,服务器将重新启动。
-addr选项允许tanukiup命令充当服务器本身。在使用tanukirpc创建并启动服务器应用程序之后,它将请求此过程。必须从*tanukirpc.Router.ListenAndServe开始申请;否则, -addr选项将无法运行。只有在tanukirpc.Router上注册的路径才会被代理到服务器应用程序。
此外,还有一个称为-catchall-target的选项,可以与-addr结合使用。此选项允许您代理未在tanukirpc.Router注册的路径的请求到另一个服务器地址。在使用前端开发服务器(例如,WebPack,Vite)时,这特别有用。
此外,它检测到go:generate稍后提到的gentypescript命令的行,并在重新启动之前自动运行它们。
使用tanukirpc的Web应用程序服务器可以基于每个端点的类型信息生成客户端代码。
gentypescript生成专门用于打字稿的客户端代码。通过使用生成的客户端实现,您可以为每个端点发送并接收具有类型安全的API请求。
要生成客户端代码,请首先使用路由器调用genclient.AnalyzeTarget ,作为明确定义目标路由器的参数。
接下来,添加以下操作:生成行:
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ -out选项指定输出文件名。另外,附加./指定要分析的软件包。
当您运行时go generate ./在包含此文件的软件包中,或者通过上述tanukiup命令启动服务器时,将生成TypeScript客户端代码。
有关更详细的用法,请参阅_esxample/todo目录。
tanukirpc支持延期挂钩进行清理。执行处理程序功能后,您可以注册要调用的函数。
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为会话管理提供了方便的实用程序。您可以使用gorilla/sessions包或其他会话管理库。
首先,创建一个会话商店并使用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
}在RegistryFactory中,您可以使用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
} Registry类型实现tanukirpc/sessions.RegistryWithAccessor接口。
tanukirpc支持OpenID连接身份验证流。您可以使用tanukirpc/auth/oidc.NewHandlers函数为此流动创建处理程序,其中包括一组处理程序以促进用户身份验证。
tanukirpc/auth/oidc.Handlers需要一个Registry来实现tanukirpc/sessions.RegistryWithAccessor接口。有关更多详细信息,请参阅会话管理部分。
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 ))
})版权(C)2024- Mackee
根据MIT许可获得许可。