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

23 篇文章 1 订阅
13 篇文章 0 订阅

请求结果处理

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下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go lang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值