Golang Go语言-Spring v1.2.0 发布,新增 Web 开发支持
Go-Spring v1.2.0 新增 web 服务器支持,底层路由器基于mux实现,旨在提供更加简单易用的开发体验。
特性:
- 自动根据 ContentType 绑定模型(类似 gin 框架手动 ctx.BindJSON 类操作)
- 自动根据函数输出类型输出 (类似 gin 框架手动调用 ctx.JSON 类接口)
- 支持从
path/header/cookie/from/body
绑定输入参数 - 支持绑定文件,上传文件处理更简单(见下面例子)
- 支持全局输出格式自定义与路由级别的自定义输出(默认以 json 输出)
- 支持自定义参数校验器(内置 expr 表达式校验器)
- 开放内部 Bind 接口,一行代码为所有基于标准库方案的 http 服务器添加上述能力
支持绑定的函数形式 (将下列函数转换为 http.HandlerFunc ):
- func(ctx context.Context)
- func(ctx context.Context) R
- func(ctx context.Context) error
- func(ctx context.Context, req T) R
- func(ctx context.Context, req T) error
- func(ctx context.Context, req T) (R, error)
友情提示:web 包不依赖 go-spring 容器,可以单独使用 (下方有例子) 😀
Demo 代码:
package main
import (
“context”
“log/slog”
“math/rand”
“mime/multipart”
“net/http”
“time”
"github.com/go-spring-projects/go-spring/gs"
"github.com/go-spring-projects/go-spring/web"
_ "github.com/go-spring-projects/go-spring/web/starter"
)
type Greeting struct {
Logger *slog.Logger logger:""
Server *web.Server autowire:""
}
func (g *Greeting) OnInit(ctx context.Context) error {
g.Server.Get("/greeting", g.Greeting)
g.Server.Get("/health", g.Health)
g.Server.Post("/user/register/{username}/{password}", g.Register)
g.Server.Post("/user/password", g.UpdatePassword)
return nil
}
func (g *Greeting) Greeting(ctx context.Context) string {
web.FromContext(ctx).
SetCookie(“token”, “1234567890”, 500, “”, “”, false, false)
return “greeting!!!”
}
func (g *Greeting) Health(ctx context.Context) error {
if 0 == rand.Int()%2 {
return web.Error(400, “health check failed”)
}
return nil
}
func (g *Greeting) Register(
ctx context.Context,
req struct {
Username string path:"username" expr:"len($)>6 && len($)<20"
Password string path:"password" expr:"len($)>6 && len($)<20"
HeadImg *multipart.FileHeader form:"headImg"
Captcha string form:"captcha" expr:"len($)==4"
UserAgent string header:"User-Agent"
Ad string query:"ad"
Token string cookie:"token"
},
) string {
g.Logger.Info(“register user”,
slog.String(“username”, req.Username),
slog.String(“password”, req.Password),
slog.String(“userAgent”, req.UserAgent),
slog.String(“headImg”, req.HeadImg.Filename),
slog.String(“captcha”, req.Captcha),
slog.String(“userAgent”, req.UserAgent),
slog.String(“ad”, req.Ad),
slog.String(“token”, req.Token),
)
return “ok”
}
func (g *Greeting) UpdatePassword(
ctx context.Context,
req struct {
Password string json:"password" expr:"len($) > 6 && len($) < 20"
// password
Token string cookie:"token"
// token
},
) string {
g.Logger.Info(“change password”, slog.String(“password”, req.Password))
return “ok”
}
func main() {
gs.Object(new(Greeting))
if err := gs.Run(); nil != err {
panic(err)
}
}
单独使用 web 服务例子:
package main
import (
“context”
“log/slog”
“mime/multipart”
"github.com/go-spring-projects/go-spring/web"
)
func Greeting(ctx context.Context) string {
return “Greeting!!!”
}
func Feedback(
ctx context.Context,
req struct {
Title string form:"title"
// 反馈标题
Message string form:"message"
// 反馈说明
Attachments []*multipart.FileHeader form:"files"
// 上传附件文件列表
EMail string form:"email"
// 联系邮箱
UserAgent string header:"User-Agent"
// 浏览器用户代理
},
) string {
slog.Info(“received user feedback”,
slog.String(“title”, req.Title),
slog.String(“message”, req.Message),
slog.String(“email”, req.EMail),
slog.String(“user-Agent”, req.UserAgent),
)
//TODO: save feedback to database.
//
return “Thanks for your feedback!!!”
}
func main() {
webSvr := web.NewServer(web.NewRouter(), web.Options{Addr: “:8080”})
webSvr.Get("/greeting", Greeting)
webSvr.Post("/feedback", Feedback)
webSvr.Run()
}
Golang Go语言-Spring v1.2.0 发布,新增 Web 开发支持
更多关于Golang Go语言-Spring v1.2.0 发布,新增 Web 开发支持的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
有木有群 要不要搞个群?有一些想法 可以交流一下
例如 绑定路由这里可以参考 goframe 那样。bind struct 使用 struct 上的方法
同时使用路径进行路由命名
例如
GET /v1/admin/user/fetch
可以是 /v1/admin/下的
v1_admin_user_fetch.go 的文件下面的
由 struct 上的 FetchGET 方法提供 ( goframe 是在 Input 的 struct 上定义这些)
其实这一套实现一个代码生成比较舒服。。。我现在自己搞了一套 但是不是很完善
更多关于Golang Go语言-Spring v1.2.0 发布,新增 Web 开发支持的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
还有直接绑定 interface
例如绑定
bind(controller.V1()) 这样就可以自动绑定所有 /v1/ 开头的全部路由
(当然前提也是需要提前生成好 V1 这个 interface )
本来挺简单的一些东西,被这么一搞变难用了。
个人观点:非常不喜欢这种被限制的方式, 就算是 aop , 那么也要精简,而不是做全。
让 gin 、echo 、iris 能够接入就行,或者参考 kratos 做成插件形式。
目前关注的人太少,所以没有群,要不直接加我 Q460229261
针对“Golang Go语言-Spring v1.2.0 发布,新增 Web 开发支持”的帖子,作为IT领域GO语言方面的专家,以下是我的专业回复:
首先,需要澄清一个常见的误区:Golang(Go语言)与Spring是两个不同的技术栈。Golang是由谷歌公司推出的一种高效、简洁的编译型编程语言,特别适用于高并发和大型项目的开发。而Spring则是一个开源的Java企业级应用开发框架,广泛应用于Web应用程序开发。
关于“Spring v1.2.0 发布,新增 Web 开发支持”的说法,如果这是指某个基于Golang的框架或库发布了新版本并增加了对Web开发的支持,那么这确实是一个值得关注的消息。然而,如果这是指Spring框架本身增加了对Golang的Web开发支持,那么这是不准确的,因为Spring是专为Java设计的。
如果此消息是指某个Golang框架(如Echo、Gin等)发布了新版本v1.2.0并增强了Web开发功能,那么开发者可以积极尝试这一新版本,以利用其增强的功能和性能优化来构建更高效、更稳定的Web应用程序。
总之,建议仔细审查消息的来源和内容,以确保对新技术发布的准确理解。