Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
/mirPublic

Mir is a toolkit for register method handler to http engine router(eg: gin,echo,iris,mux,httprouter) use struct tag info.

License

NotificationsYou must be signed in to change notification settings

alimy/mir

Repository files navigation

GoGoDocSourcegraph

Logo

Mir

一个很酷的开发RESTful API的辅助工具

Mir 是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,适配多种HTTP框架,包括Gin,Chi,Hertz,Echo,Iris,Fiber,Macaron,Mux,httprouter

使用说明

  • 生成样板项目
% go install github.com/alimy/mir/mirc/v4@latest% mirc new -hcreate template projectUsage:  mirc new [flags]Flags:  -d, --dst string     genereted destination target directory (default".")  -h, --helphelpfor new      --mir string     mir replace package name or place  -p, --pkg string     project's package name (default "github.com/alimy/mir-example")  -s, --style string   generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin")% mirc new -d example% tree exampleexample.|-- Makefile|-- README.md|-- go.mod|-- go.sum|-- main.go|-- mirc|   |-- auto|   |   `-- api|   |       |-- site.go|   |       |-- v1|   |       |   `-- site.go|   |       `-- v2|   |           `-- site.go|   |-- gen.go|   `-- routes|       |-- site.go|       |-- v1|       |   `-- site.go|       `-- v2|           `-- site.go`-- servants    |-- core.go    |-- servants.go    |-- site.go    |-- site_v1.go    `-- site_v2.go% cd example% make generate% make run
  • RESTful接口定义:
// file: mirc/routes.gopackage routesimport (."github.com/alimy/mir/v4"."github.com/alimy/mir/v4/engine")funcinit() {AddEntry(new(User))}typeLoginReqstruct {Namestring`json:"name"`Passwdstring`json:"passwd"`}typeLoginRespstruct {JwtTokenstring`json:"jwt_token"`}// User user interface infotypeUserstruct {Chain`mir:"-"`Group`mir:"v1"`Loginfunc(Post,LoginReq)LoginResp`mir:"/login/"`Logoutfunc(Post)`mir:"/logout/"`}
  • 代码生成:
// file: mirc/auto/api/routes.go// Code generated by go-mir. DO NOT EDIT.// versions:// - mir v4.0.0package routesimport ("net/http""github.com/alimy/mir/v4""github.com/gin-gonic/gin")type_binding_interface {Bind(*gin.Context) mir.Error}type_render_interface {Render(*gin.Context)}type_default_interface {Bind(*gin.Context,any) mir.ErrorRender(*gin.Context,any, mir.Error)}typeLoginReqstruct {Namestring`json:"name"`Passwdstring`json:"passwd"`}typeLoginRespstruct {JwtTokenstring`json:"jwt_token"`}typeUserinterface {_default_// Chain provide handlers chain for ginChain() gin.HandlersChainLogin(*gin.Context,*LoginReq) (*LoginResp, mir.Error)Logout(*gin.Context) mir.ErrormustEmbedUnimplementedUserServant()}// RegisterUserServant register User servant to ginfuncRegisterUserServant(e*gin.Engine,sUser) {router:=e.Group("v1")// use chain for routermiddlewares:=s.Chain()router.Use(middlewares...)// register routes info to routerrouter.Handle("POST","/login/",func(c*gin.Context) {select {case<-c.Request.Context().Done():returndefault:}req:=new(LoginReq)iferr:=s.Bind(c,req);err!=nil {s.Render(c,nil,err)return}resp,err:=s.Login(req)s.Render(c,resp,err)})router.Handle("POST","/logout/",func(c*gin.Context) {select {case<-c.Request.Context().Done():returndefault:}s.Render(c,nil,s.Logout(c))})}func (UnimplementedUserServant)Chain() gin.HandlersChain {returnnil}func (UnimplementedUserServant)Login(c*gin.Context,req*LoginReq) (*LoginResp, mir.Error) {returnnil,mir.Errorln(http.StatusNotImplemented,http.StatusText(http.StatusNotImplemented))}func (UnimplementedUserServant)Logout(c*gin.Context) mir.Error {returnmir.Errorln(http.StatusNotImplemented,http.StatusText(http.StatusNotImplemented))}func (UnimplementedUserServant)mustEmbedUnimplementedUserServant() {}
  • 接口实现:
// file: servants/user.gopackage servantsimport ("github.com/alimy/mir-example/v4/mirc/auto/api""github.com/alimy/mir/v4""github.com/gin-gonic/gin")typebaseSrvstruct{}func (baseSrv)Bind(c*gin.Context,objany) mir.Error {iferr:=c.ShouldBind(obj);err!=nil {mir.NewError(http.StatusBadRequest,err)}returnnil}func (baseSrv)Render(c*gin.Context,dataany,err mir.Error) {iferr==nil {c.JSON(http.StatusOK,data)}else {c.JSON(err.StatusCode(),err.Error())}}typeuserSrvstruct {baseSrvapi.UnimplementedUserServant}funcnewUserSrv() api.Site {return&userSrv{}}
  • 服务注册:
// file: servants/servants.gopackage servantsimport ("github.com/alimy/mir-example/v4/mirc/auto/api""github.com/gin-gonic/gin")// RegisterServants register all the servants to gin.EnginefuncRegisterServants(e*gin.Engine) {api.RegisterUserServant(e,newUserSrv())// TODO: some other servant to register}
  • 程序启动:
// file: main.gopackage mainimport ("log""github.com/alimy/mir-example/v4/servants""github.com/gin-gonic/gin")funcmain() {e:=gin.Default()// register servants to ginservants.RegisterServants(e)// start servant serviceiferr:=e.Run();err!=nil {log.Fatal(err)}}

使用go-mir的项目

  • examples - 本项目自带的demo,主要演示了如何使用Mir快速进行RESTful API的后端开发。
  • paopao-ce - 一个清新文艺的微社区,提供类似Twiter/微博的推文分享服务。

[8]ページ先頭

©2009-2025 Movatter.jp