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 )
}
}tanukiupgentypescript การฉีดรีจิสทรีเป็นคุณสมบัติเฉพาะของ tanukirpc คุณสามารถฉีดวัตถุรีจิสทรีไปยังฟังก์ชันตัวจัดการ
นอกจากนี้รีจิสทรีสามารถสร้างขึ้นได้สำหรับแต่ละคำขอ สำหรับรายละเอียดเพิ่มเติมโปรดดู _example/simple-registry
tanukirpc รองรับการผูกคำขอต่อไปนี้โดยค่าเริ่มต้น:
/entity/{id} พา ธ ): ใช้แท็ก urlparam structqueryapplication/json ): ใช้แท็ก json structapplication/x-www-form-urlencoded ): ใช้แท็ก struct formrawbody struct กับ [] byte หรือ io.readcloser หากคุณต้องการใช้การเชื่อมโยงอื่น ๆ คุณสามารถใช้อินเทอร์เฟซ tanukirpc.Codec และระบุโดยใช้ตัวเลือก tanukirpc.WithCodec เมื่อเริ่มต้นเราเตอร์
tanukirpc . NewRouter ( YourRegistry , tanukirpc . WithCodec ( yourCodec )) tanukirpc ตรวจสอบความถูกต้องโดยอัตโนมัติโดย go-playground/validator เมื่อมี validate แท็ก struct tag ใน reged struct
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 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 สามารถสร้างรหัสฝั่งไคลเอ็นต์ตามข้อมูลประเภทของแต่ละจุดสิ้นสุด
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 ต้องการ 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