申请后果解决

wego框架反对以字符串、json、xml、html等格局响应HTTP申请,相应的函数定义如下:

  • Write(code int, contentType string, data []byte)
  • WriteText(code int, data string)
  • WriteJSON(code int, obj interface{})
  • WriteXML(code int, obj interface{})
  • WriteHTML(code int, filename string, data interface{})

输入JSON数据

wego对于JSON的反对十分好,能够十分不便的开发一个基于JSON输入的API。若要返回JSON格局的申请后果,能够应用WriteJSON()函数:

func writeJson(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    c.WriteJSON(200, user)}/*输入后果为:{"Name":"demo","ID":1,"Age":12}*/

应用WriteJSON函数输入的JSON字符串是扁平的,没有进行缩进显示。若须要输入更加好看的json数据,则能够应用WriteIndentedJSON()函数:

func writeIndentedJSON(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    c.WriteIndentedJSON(200, user)}/*输入后果为:{    "Name": "demo",    "ID": 1,    "Age": 12}*/

输入JSONP数据

JSONP能够跨域,次要是利用了script标签跨域的能力,script标签能够援用任何域名下的JS文件。wego反对输入JSONP申请后果。示例代码如下:

  • html代码:

    <html lang="en"><head>  <meta charset="utf-8">  <title>file upload</title>  <script type="text/javascript" src="http://127.0.0.1:8080/jsonp?callback=alert"></script></head><body></body></html>
  • 服务端代码:

    func writeJSONP(c *wego.WebContext) {  var user User  user.ID = 1  user.Name = "demo"  user.Age = 12  c.WriteJSONP(200, user)}

    阐明:http的申请中必须有:callback参数,若不存在callback参数,则返回失常的json数据。

输入XML数据

返回xml数据的解决形式跟json相似,要返回XML数据,只须要应用WriteXML()办法即可:

func writeXML(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    c.WriteXML(200, user)}

输入HTML数据

wego框架采纳了Go语言默认的模板引擎,所以和Go的模板语法一样。以下是一个输入HTML页面的例子:

func writeHtml(c *wego.WebContext) {    c.WriteHTML(200, "./views/index.html", nil)}

若您的页面有多个HTML模板组成,您能够应用WriteHTMLS:

WriteHTMLS(code int, filenames []string, data interface{})

其中:filenames是模板文件的数组,数组中的第一个文件是主文件模板。示例代码:

  • 首先定义一个HTML模板(layout.html)作为页面布局:

    <html lang="en"><head>  <meta charset="utf-8"></head><body>  <h1>this is layout</h1>  {{ template "content" .}}</body></html>
  • 而后定义内容模板(index.html):

    <h2>this is index</h2>{{define "content"}}<h2>hello : {{.Name}}</h2>{{end}}

*服务端代码

func writeHtmls(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    files := []string {        "./views/layout.html",        "./views/index.html",    }    c.WriteHTMLS(200, files, user)}
  • 若HTML页面由一个布局模板以及一个内容模板组成,也能够应用WriteLayoutHTML()函数:

    func writeLayoutHtml(c *wego.WebContext) {  var user User  user.ID = 1  user.Name = "demo"  user.Age = 12  c.WriteLayoutHTML(200, "./views/layout.html", "./views/index.html",user)}

模板函数

如果您的模板文件中应用了模板函数,须要事后将所需的模板函数进行注销, 个别在web.Run()之前进行模板函数的初始化。示例代码:

  • 首先进行模板函数的初始化

    func GetUserID(id int64) string {  return fmt.Sprintf("ID_%d", id)}func main() {  web, err := wego.NewWeb()  if err != nil{      log.Error(err)      return  }  wego.AddTemplFunc("GetUserID", GetUserID)  web.GET("/templfunc", ShowHtmlWithTemplFunc)  err = web.Run(":8080")  if err != nil {      log.Error(err)  }}
  • 在模板文件中应用模板函数

    <html lang="en"><body>  <h2>hello : {{.Name}}</h2>  <h2>id : {{GetUserID .ID}}</h2></body></html>
  • 服务端代码

    func ShowHtmlWithTemplFunc(c *wego.WebContext) {  var user User  user.ID = 1  user.Name = "demo"  user.Age = 12  c.WriteHTML(200, "./views/content.html", user)}

拜访动态资源

我的项目中的js、css、jpg之类的文件文件称之为动态资源。在wego中拜访动态资源须要应用StaticPath进行动态资源注册,或者应用StaticFile来为一个文件注册路由:

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.StaticPath("/static", "./static")    web.StaticFile("/favicon.ico", "./rfavicon.ico")        err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

文件下载

如果你想实现动静解决文件下载,例如在文件下载的时候验证下用户的权限,这种状况下能够应用WriteFile来实现输入文件:

func writeFile(c *wego.WebContext) {    c.WriteFile("./demo.xls", "demo.xls" )}

应用Gzip压缩输入

输入内容时若须要应用Gzip,能够在调用WriteXXX函数之前调用UseGzip()来设置是否应用Gzip进行压缩输入:

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/gzip", ShowHtmlWithGzip)    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}func ShowHtmlWithGzip(c *wego.WebContext) {    c.UseGzip(true).WriteHTML(200, "./content.html", nil)}

另外,也能够通过配置文件设置是否开启Gzip性能:

#是否开启 gzipgzip_on = true#压缩长度阈值,只有超过gzip_size的会被压缩返回gzip_size = 256

开启Gzip后所有超过gzip_sized大小的返回数据都会被压缩解决。若开启全局Gzip后某些申请不须要Gzip,您能够应用拦截器来管制是否采纳gzip来输入内容。

设置cookie

func setCookie(c *wego.WebContext)  {    val, err := c.Input.Cookie("demo")    if err != nil {        log.Error(err)    }    cookie := &http.Cookie{        Name:     "demo",        Value:    "test",        Path:     "/",        HttpOnly: true,    }    c.SetCookie(cookie)}

重定向

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/redirect", func(c *wego.WebContext) {        c.Redirect(302, "/index")    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

错误处理

在web开发的中,如果遇到谬误,须要输入一个谬误提醒给用户,例如500谬误。wego框架提供了一些列函数用于谬误输入:

  • Abort(code int)
  • AbortWithText(code int, value string)
  • AbortWithError(code int, err error)
  • AbortWithJson(code int, obj interface{})
  • AbortWithXml(code int, obj interface{})
  • AbortWithHtml(code int, filenames string, data interface{})

示例代码:

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/abort", func(c *wego.WebContext) {        name := c.Param.GetString("name")        if name.Error != nil {            c.AbortWithError(500, name.Error)            return        }        c.WriteText(200, "hello " + name.Value)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

全局的谬误处理函数

除了下面的谬误处理函数,用户还能够定义全局的谬误处理函数:

  • hanlder_401 HandlerFunc
  • hanlder_404 HandlerFunc
  • hanlder_500 HandlerFunc

示例代码:定义全局500谬误处理函数

func Handler500(c *wego.WebContext) {    c.WriteText(500, "这是一个500谬误")}

示例代码:设置500谬误处理函数

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/abort", abort_500)    web.SetHandler500(Handler500)    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

示例代码:应用500谬误处理函数

func abort_500(c *wego.WebContext)  {    name := c.Param.GetString("name")    if name.Error != nil {        c.Abort500()        return    }    c.WriteText(200, "hello " + name.Value)}

获取wego

go get github.com/haming123/wego去github.com下载