tanukirpc 는 실용적이고 빠르게 발달하고 유형-안전하며 사용하기 쉬운 RPC/라우터 라이브러리입니다. 이 라이브러리는 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 Struct 태그를 사용하십시오application/x-www-form-urlencoded ) : form 구조 태그를 사용하십시오rawbody Struct 태그 사용 다른 바인딩을 사용하려면 tanukirpc.Codec 인터페이스를 구현하고 라우터를 초기화 할 때 tanukirpc.WithCodec 옵션을 사용하여 지정할 수 있습니다.
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc 요청 구조에 유효성 validate 구조 태그가 포함 된 경우 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" )
} go-chi/chi/middleware 또는 func (http.Handler) http.Handler style middlewares와 함께 tanukirpc 사용할 수 있습니다. Gorilla/Handlers도 여기에 포함되어 있습니다.
미들웨어를 사용하려면 *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 에 등록 된 경로 만 서버 응용 프로그램에 프록시됩니다.
또한 -addr 과 함께 사용할 수있는 -catchall-target 이라는 옵션이 있습니다. 이 옵션을 사용하면 tanukirpc.Router 에 등록되지 않은 경로에 대한 요청을 다른 서버 주소로 프록시 할 수 있습니다. 이것은 프론트 엔드 개발 서버 (예 : Webpack, Vite)로 작업 할 때 특히 유용합니다.
또한 go:generate 나중에 언급 한 gentypescript 명령에 대한 선을 생성하고 다시 시작하기 전에 자동으로 실행됩니다.
tanukirpc 사용하는 웹 애플리케이션 서버는 각 엔드 포인트의 유형 정보를 기반으로 클라이언트 측 코드를 생성 할 수 있습니다.
gentypescript TypeScript에 대해 특별히 클라이언트 측 코드를 생성합니다. 생성 된 클라이언트 구현을 사용하면 각 엔드 포인트에 대한 유형 안전을 통해 API 요청을 보내고받을 수 있습니다.
클라이언트 코드를 생성하려면 먼저 대상 라우터를 명확하게 정의하기 위해 라우터로 genclient.AnalyzeTarget 호출하십시오.
다음으로 다음을 추가하십시오 : 선 생성 라인 :
//go:generate go run github.com/mackee/tanukirpc/cmd/gentypescript -out ./frontend/src/client.ts ./ -out 옵션은 출력 파일 이름을 지정합니다. 또한, 분석 할 패키지를 지정하려면 ./
실행 go generate ./ 이 파일이 포함 된 패키지에서 또는 위에서 언급 한 tanukiup 명령을 통해 서버를 시작하면 TypeScript 클라이언트 코드가 생성됩니다.
보다 자세한 사용은 _example/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 Connect 인증 흐름을 지원합니다. tanukirpc/auth/oidc.NewHandlers 함수를 사용 하여이 흐름의 핸들러를 생성 할 수 있습니다. 여기에는 사용자 인증을 용이하게하는 핸들러 세트가 포함됩니다.
tanukirpc/auth/oidc.Handlers tanukirpc/sessions.RegistryWithAccessor 인터페이스를 구현하는 Registry 필요합니다. 자세한 내용은 세션 관리 섹션을 참조하십시오.
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- 맥키
MIT 라이센스에 따라 라이센스.