首页 文章 精选 留言 我的

精选列表

搜索[模型路由],共10000篇文章
优秀的个人博客,低调大师

go-mir v5.0.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v5.0.1 发布了,v5 版本带来全新的 RESTful API 开发方式,提供媲美 gRPC 服务开发的体验,方便快捷,欢迎使用。 ​Mir 是一套提供类似 gRPC 服务开发体验的快速开发 RESTful API 后端开发脚手架,适配多种 HTTP 框架,包括Gin,Chi,Hertz,Echo,Iris,Fiber,Macaron,Mux,httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v5@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for 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 example example . |-- 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 API 接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v5" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { // 标示为 API Entry, group为v1, 带有中间件接口 Schema `mir:"v1,chain"` Login func(Post, LoginReq) LoginResp `mir:"login"` Logout func(Post) `mir:"logout"` } 代码生成 // file: mirc/auto/api/routes/v1.go // Code generated by go-mir. DO NOT EDIT. // versions: // - mir v5.0.0 package v1 import ( "net/http" "github.com/alimy/mir/v5" "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.Error Render(*gin.Context, any, mir.Error) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { _default_ // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(*gin.Context, *LoginReq) (*LoginResp, mir.Error) Logout(*gin.Context) mir.Error mustEmbedUnimplementedUserServant() } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "login", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req := new(LoginReq) if err := 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(): return default: } s.Render(c, nil, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} 接口实现 // file: servants/user.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type baseSrv struct{} func (baseSrv) Bind(c *gin.Context, obj any) mir.Error { if err := c.ShouldBind(obj); err != nil { mir.NewError(http.StatusBadRequest, err) } return nil } func (baseSrv) Render(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } type userSrv struct { baseSrv api.UnimplementedUserServant // TODO: add other fields } func newUserSrv() api.User { return &userSrv{} } 服务注册 // file: servants/servants.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v5/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples-go-mir自带的 demo,主要演示了如何使用Mir快速进行 RESTful API 的后端开 发; paopao-ce-一个清新文艺的微社区,提供类似 Twiter / 微博的推文分享服务; paopao-ce 通过使用go-mir更好、更便捷的开发 RESTful API 服务与 gRPC 服务。

优秀的个人博客,低调大师

go-mir v3.0.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v3.0.0 发布了,v3版本带来全新的RESTful API开发方式,提供媲美gRPC服务开发的体验,方便快捷,欢迎参考使用。 ​Mir 是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,适配多种HTTP框架,包括Gin, Chi, Hertz, Echo, Iris, Fiber, Macaron, Mux, httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v3@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for 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 example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- main.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 build RESTful接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v3" . "github.com/alimy/mir/v3/engine" ) func init() { AddEntry(new(User)) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { Chain Chain `mir:"-"` Group Group `mir:"v1"` Login func(Post, LoginReq) LoginResp `mir:"/login/"` Logout func(Post) `mir:"/logout/"` } 代码生成 // file: mirc/auto/api/routes.go // Code generated by go-mir. DO NOT EDIT. package routes import ( "net/http" "github.com/alimy/mir/v3" "github.com/gin-gonic/gin" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) Logout(c *gin.Context) mir.Error mustEmbedUnimplementedUserServant() } type UserBinding interface { BindLogin(c *gin.Context) (*LoginReq, mir.Error) mustEmbedUnimplementedUserBinding() } type UserRender interface { RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) RenderLogout(c *gin.Context, err mir.Error) mustEmbedUnimplementedUserRender() } // UnimplementedUserServant can be embedded to have forward compatible implementations. type UnimplementedUserServant struct { } // UnimplementedUserBinding can be embedded to have forward compatible implementations. type UnimplementedUserBinding struct { BindAny func(*gin.Context, any) mir.Error } // UnimplementedUserRender can be embedded to have forward compatible implementations. type UnimplementedUserRender struct { RenderAny func(*gin.Context, any, mir.Error) } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "/login/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req, err := b.BindLogin(c) if err != nil { r.RenderLogin(c, nil, err) } resp, err := s.Login(c, req) r.RenderLogin(c, resp, err) }) router.Handle("POST", "/logout/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } r.RenderLogout(c, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} func (b UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { obj := new(LoginReq) err := b.BindAny(c, obj) return obj, err } func (b UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} func (r UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { r.RenderAny(c, data, err) } func (r UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { r.RenderAny(c, nil, err) } func (r UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} 接口实现 // file: servants/user.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" ) type userSrv struct { api.UnimplementedUserServant } type userBinding struct { *api.UnimplementedUserBinding } type userRender struct { *api.UnimplementedUserRender } func newUserSrv() api.Site { return &userSrv{} } func newUserBinding() api.SiteBinding { return &siteBinding{ UnimplementedSiteBinding: &api.UnimplementedSiteBinding{ BindAny: bindAny, }, } } func newUserRender() api.SiteRender { return &siteRender{ UnimplementedSiteRender: &api.UnimplementedSiteRender{ RenderAny: renderAny, }, } } func bindAny(c *gin.Context, obj any) mir.Error { if err != c.ShouldBind(obj); err != nil { return mir.NewError(http.StatusBadRequest, err) } return nil } func renderAny(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } 服务注册 // file: servants/servants.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v3/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples- go-mir自带的demo,主要演示了如何使用Mir快速进行RESTful API的后端开 发; paopao-ce - 一个清新文艺的微社区,提供类似Twiter/微博的推文分享服务; paopao-ce通过使用go-mir更好、更便捷的开发RESTful API服务与gRPC服务。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册