📯

上下文概要

🌾举个麦子

r.GET("/user/:name", func(c *znet.Context) { name := c.GetParam("name") c.String(200, name) })

输入输出

路由参数

c.GetParam("name")

GET 参数

name,ok := c.GetQuery("name") // 支持设置默认值 c.DefaultQuery("name", "奥特曼") // 如果不存在name参数则返回 奥特曼 // 获取全部 GET 参数值 c.GetAllQueryst() // 获取数组类型的 GET 参数值,如:name=1&name=2 c.GetQueryArray("name")

POST 参数

// 支持设置默认值 name := c.DefaultPostForm("name", "奥特曼") // 如果不存在name参数则返回 奥特曼 // curl -d "name=isMyName;name=name2" http://127.0.0.1:3788/ // ["isMyName","name2"] nameArray, ok := c.GetPostFormArray("name") // 获取name数组 // ["isMyName"] names, ok := c.GetPostForm("name") // 获取第一个name值 name := c.PostForm("name") // curl -d "name[one]=11;name[too]=22" http://127.0.0.1:3788/ // map[one:11 too:22] names, ok := c.GetPostFormMap("name") // 获取name字典 names := c.PostFormMap("name") // 获取name字典 // 获取请求体 raw, err := c.GetDataRaw() // 解析 multipart form c.MultipartForm() // 获取文件上传 file, err := c.FormFile(key) defer file.Close() // 文件保存,先通过 FormFile 获取文件对象,dist 为文件路径 err := c.SaveUploadedFile(file, dist)

结构体绑定

type Form struct { Name string `json:"name"` } var data Form c.Bind(&data) // 绑定并且验证数据,只支持验证不支持处理,如有需要请自行参考 数据验证 rule := c.ValidRule().Required() err := c.BindValid(&data,map[string]zvalid.Engine{ "name":rule.SetAlias("姓名") })

数据验证

更多文档请参考 数据验证
name, err := c.Valid(c.ValidRule(),"参数 Name").Required().HasLetter().String() if err != nil { zlog.Debug("验证失败", err) }

客户端 IP

ip := c.GetClientIP() // 默认情况 X-Forwarded-For 之类是全部可信的, // 如果你不是使用 nginx 反向代理并且设置了 X-Forwarded-For $proxy_add_x_forwarded_for; // 那么请自行配置可信代理之后再获取客户端 IP // 支持配置 IP 与 IP 段 znet.TrustedProxies = []string{"113.65.111.18","113.65.112.1/24"} ip := c.GetClientIP() // 只信任 IP 113.65.111.18 或 IP 段 113.65.112.1 设置的请求头

UserAgent

c.GetUserAgent() //Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0

Referer

c.GetReferer()

Cookie

c.GetCookie("name") c.SetCookie("name","你猜")

返回内容

注意一个请求应该只使用一次下面方法

String

c.String(200, "ok")

File

这是直接输出文件,如要输出模板请使用 c.Template()
c.File("./html/index.html") // 文件下载 c.SetHeader("Content-Type", "application/octet-stream") c.SetHeader("Content-Disposition", "attachment; filename=\"file.xls\"") c.File("./file.xls")

Template

使用请参考:【服务配置】→ 设置模板目录
如需要打包模板:【嵌入文件】 → 打包模板
// 请尽量使用 r.LoadHTMLGlob("resource/*") 全局预加载模板 c.Template(200, "html/docs.html", znet.Data{"title": "ZlsGo 文档 "}) // html/docs.html <html><title>{{.title}}</title><body></body></html> // 模板包实现了HTML上下文感知引擎,以提供注入安全的html。 // 换句话说,它知道它在script标签内执行,因此它不输出原始字符串,而是输出与js兼容的json编码的字符串。 // 要修复它,与注释所建议的不同,请将字符串设置为 template.JS 值,并且安全措施将不会尝试保护字符串。 template.JS("在 script 内无引号字符串")

Templates

如果没有使用全局预加载而又要模板嵌套
c.Templates(200, []string{"index.html", "footer.html"}, znet.Data{}) // html/index.html <html><title>{{.title}}</title><body>{{template "body".}}</body></html> // html/body.html {{define "body"}}This is body{{end}}

HTML

c.HTML(200,"<strong>我是一段HTML</strong>")

JSON

c.JSON(200,znet.Data{"data":"is Data"}) // {"data":"is Data"} c.JSON(200,znet.ApiData{200,"请求成功",nil}) // {"code":200,"msg":"请求成功","data":null} c.ApiJSON(210,"请求失败",nil) // {"code":210,"msg":"请求成功","data":null}

Redirect

// 重定向 c.Redirect("https://docs.73zls.com") c.Redirect("https://www.google.com", 301)

其他方法

重定向路径

Abort

终止掉后面全部 znet.HandlerFunc ,多用于中间件内
c.Abort() c.Abort(statusCode)

Log

c.Log 对象对应的是 *zlog.Logger,使用方法参考 【日志输出
c.Log.Debug("这是一个Debug") // 如果当前为生产环境则不会显示该日志 c.Log.Error("这是一个Error") // 就算当前为生产环境也会显示该日志