Golang Go语言中 自己在学习时写了GoGym,一个简洁灵活的RESTful微框架
受 PHP 框架 Laravel 的启发, GoGym 兼顾了代码的简洁易用性 框架解决的需求是
- 只需要定义一个 Controller 并且在注册了之后,可以定义任意数量的 Action ,只需要将其和路由还有方法匹配好
- 用户只要返回结果,自动生成 JSON 格式的 response
示例代码:
type IndexController struct {
}
func (IndexController *IndexController) Index(values url.Values, headers http.Header) (statusCode int, response interface{}) {
return 200, map[string]string{"hello": "world"}
}
func main() {
var apiService = GoGym.Prepare()
apiService.Get("/", "IndexController[@Index](/user/Index)")
apiService.RegisterController(&IndexController{})
apiService.Serve(3000)
}
可以看到,我们只需要上面短短的 11 行代码,就能起一个 hello world 的 RESTful 服务
欢迎大家发 issue 或者邮件来讨论不足的地方,让我可以改进,也可以提交 feature requirement ,如果觉得不错也欢迎 star
项目地址: https://github.com/ZhenhangTung/GoGym
八卦一下,起这个项目名字就是因为自己喜欢去健身房,对自己也是一种督促,也希望大家多多运动保重身体,敲代码是产出的话,休息运动就是给自己充值了。
共勉!
Golang Go语言中 自己在学习时写了GoGym,一个简洁灵活的RESTful微框架
更多关于Golang Go语言中 自己在学习时写了GoGym,一个简洁灵活的RESTful微框架的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
支持一下,造轮子不容易
更多关于Golang Go语言中 自己在学习时写了GoGym,一个简洁灵活的RESTful微框架的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
十分感谢!大家一起加油💪
看不懂。
这是要注册个 controller 类,实现 controller interface ?
直接用 httprouter 就可以了啊
var jsonAction = func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
body, _ := json.Marshal(map[string]string{“hello”: “world”})
w.Write(body)
}
router := httprouter.New()
router.RedirectTrailingSlash = false
router.RedirectFixedPath = false
router.GET("/test", jsonAction)
http.Handle("/controller/", http.StripPrefix("/controller", router))
http.ListenAndServe(":3000", http.DefaultServeMux)
要说看得出来的问题的话,感觉以字符串形式传 action 太坑
及不能类型检测,不能错误检查。
十分感谢!我之前都没发现有 router 这么厉害的项目。
我是在学习过程中,发现 Golang 很多 web 框架,比如 echo 等,都会先预定好一些方法( Action ),比如在 Controller(有些框架定义为 router)中有 GET , POST 等方法来接收 GET 和 POST 等请求,这样很不错,也符合 Golang 的语言特性,但我觉得不太能满足业务需求,如果我有一个 Controller ,就是负责首页逻辑的,需要接收 2 个 GET 方法,按照目前我的理解来看,我就要创建两个 controller 了。
我解决的事情是,只需要建立一个 Controller ,下面可以定义无数个 Action 。
用 apiService.Get("/", “IndexControllerIndex”)注册了后,在底层就会生成一个包含 http request , route , Controller , Action 的 map ,最后我用的是 reflect 去调用所有的 Action 。
你提到的类型检测,不能错误检查这两点我会考虑并且看看怎么加入。
一个 router 就是一个控制器。
想一想,写 web 为什么一定要有控制器类呢?
方法 /函数本身就可以作为变量,所以其实不一定需要控制器类这个概念。
还有就是。
要代码补全的话,直接吧 action 传进去就可以了。
比如
indexController:=&IndexController{}
apiService.Get("/", indexCroller.index)
以我的 blog 为例
https://gist.github.com/jarlyyn/57ac8e2dc950e9c7715de27149481319
用了两个 router
其实不就等于是两个控制器?
的确没有任何规定要规定大家都用 controller class ,然后在里面定义一系列 method 作为 action 来开发项目呢,就像写代码也不一定要用 OOP 思想来写。这些思想需要我们在某些前提下讨论。
如果我写一个小项目(我觉得自己的个人博客也算其中之一吧),或者小脚本,不管是 golang , php 还是 js ,以我目前的浅薄的开发经验,都不需要建立 class ( Golang 里是 struct ),搞个 class 来有时甚至只是种累赘。
但如果我们的项目发展到一定程度了呢,有同事朋友或者其他开发者参与进来了呢,考虑的不只是实现了,我们还要考虑 organization ,往大一点说就是架构,考虑他人的开发感受,我认为这就是会有各种设计模式的原因吧,大家在同一个 convention 下开发(注意,我没有用 law 这个词)。
我的小项目目标是“ RESTful API ”。
扯开点说,代码除了代码本身的语法和规定,怎么写都是大家自己的决定, free style 都可以,只是在每个情景之下都会有 pros&cons ,是适合不适合的问题,并没有对错。
—
我:PHP 是世界上最好的语言,不是吗?
A:Java 才是
B:Bullshit!
…
2333~
嗯嗯,理解,你的建议很棒,我自己已经开好了 issue 着手改造了。
我是写了 PHP 最近因为公司业务需求歪到了 Golang 哈哈哈。
middleware 我还不是特别熟悉,在 laravel5 引入了 middleware 时候我一直在用 Phalcon 写业务,没有机会去学,我去调研学习一下这个概念
Laravel 本身比很多 web 框架都要麻烦复杂得多,用它的方式写 go 还不如不要
嗯嗯,在研究 Laravel 源码时候,拿路由举例,它使用了一些 Symfony 路由中的 Compile ,然后拿到结果自己再处理,我个人认为太复杂,所以我自己在实现路由时候并没有用那一套。
Ruby 的 Sinatra 几乎是这类框架的典范,可以参考下
谢谢指教!不过我现在还不会 Ruby ,阅读细节可能会比较费劲,可以看下大局的思路
你好!很高兴看到你在学习Go语言的过程中能够动手实践并开发出GoGym这样一个RESTful微框架,这不仅是学习过程中的重要一步,也是提升能力的绝佳方式。
Go语言以其简洁、高效和强大的并发处理能力在RESTful API开发领域有着广泛的应用。你选择的RESTful架构风格非常适合构建可扩展和可维护的网络应用。
在开发GoGym框架的过程中,你可能已经接触到了Go语言的许多核心特性,如goroutines、channels以及内置的net/http包等。这些特性使得Go语言在处理并发请求和构建高效API方面表现出色。
为了进一步提升GoGym框架的健壮性和实用性,你可以考虑以下几个方向进行改进:
-
增强错误处理:确保所有可能的错误情况都得到妥善处理,并提供有用的错误信息给客户端。
-
完善路由机制:增加对复杂路由模式的支持,如带参数的路由和嵌套路由等。
-
优化性能:通过代码优化和合理的资源使用,提高框架的响应速度和吞吐量。
-
增加中间件支持:中间件机制可以方便地实现诸如认证、日志记录、请求处理等通用功能。
-
编写文档和测试:为GoGym框架编写详细的文档和测试用例,方便其他开发者使用和维护。
希望这些建议能对你的GoGym框架开发有所帮助,期待看到你更多的进步和成果!