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許可獲得許可。