乐趣区

关于go:Go语言WEB框架请求结果处理

申请后果解决

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 性能:

# 是否开启 gzip
gzip_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 下载

退出移动版