虽然当前基于XML的API应用不多,但是Gin也提供了便捷的XML生成,可以把这些用于需要XML的地方,比如网站的sitemap,rss订阅的atom等。
来个map试试
1
2
3
4
5
6
7
|
func main() {
r := gin.Default()
r.GET("/xml", func(c *gin.Context) {
c.XML(200, gin.H{"wechat": "flysnow_org", "blog": "www.flysnow.org"})
})
r.Run(":8080")
}
|
在Gin中,要生成XML,只需要使用context.XML
方法即可。以上的例子,我们运行访问浏览器http://localhost:8080/xml
可以看到如下信息:
1
2
3
4
|
<map>
<wechat>flysnow_org</wechat>
<blog>www.flysnow.org</blog>
</map>
|
根节点是map
,这是因为gin.H
其实就是一个map
,map
的key
成为了xml里的节点,而map
的value
成为了xml节点的值。
自定义struct
对于自定义的struct,Gin同样可以很方便的转为XML。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
func main() {
r := gin.Default()
r.GET("/xml", func(c *gin.Context) {
c.XML(200, User{ID: 123, Name: "张三", Age: 20})
})
r.Run(":8080")
}
type User struct {
ID int
Name string
Age int
}
|
这个例子和 Golang Gin 实战(八)| JSON渲染输出 非常相似,现在我们运行再通过浏览器访问看看。
1
2
3
4
5
|
<User>
<ID>123</ID>
<Name>张三</Name>
<Age>20</Age>
</User>
|
根节点已经变成了这个structUser
,而根节点下的节点,就是User
的字段。
自定义节点名字
和JSON一样,我们也可以通过字段的xml
tag来自定义对应的字段的别名。
1
2
3
4
5
|
type User struct {
ID int `xml:"id"`
Name string `xml:"name"`
Age int `xml:"age"`
}
|
只需要改成这样,我们再打开浏览器访问,发现已经变了。
1
2
3
4
5
|
<User>
<id>123</id>
<name>张三</name>
<age>20</age>
</User>
|
已经变成我们重新定义好的别名了。Gin的xml生成,使用的是Golang内置的encoding/xml
,所以可以像使用encoding/xml
一样,来自定义我们的XML格式。
xml数组
XML的数组和JSON的不一样,因为XML必须要有一个根节点,所以我们必须要有一个对象存放我们的struct数组,比如map.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
func main() {
r := gin.Default()
r.GET("/xml", func(c *gin.Context) {
allUsers := []User{{ID: 123, Name: "张三", Age: 20}, {ID: 456, Name: "李四", Age: 25}}
c.XML(200, gin.H{"user": allUsers})
})
r.Run(":8080")
}
type User struct {
ID int `xml:"id"`
Name string `xml:"name"`
Age int `xml:"age"`
}
|
使用一个gin.H
存放,key
是user
,我们运行查看信息:
1
2
3
4
5
6
7
8
9
10
11
12
|
<map>
<user>
<id>123</id>
<name>张三</name>
<age>20</age>
</user>
<user>
<id>456</id>
<name>李四</name>
<age>25</age>
</user>
</map>
|
已经是一个数组了。
小结
XML其实已经越来越不常用了,我们自己开发API,还是要用JSON的方式。不光XML不常用,其实Gin提供的YAML的支持更不常用,而且Gin提供的YAML的用法和XML、JSON基本一样,所以不再进行介绍,大家可以自己练练
精彩文章推荐
Golang Gin 实战(九)| JSONP跨域和劫持
Golang Gin 实战(八)| JSON渲染输出
Golang Gin 实战(七)| 分组路由源代码分析
Golang Gin 实战(六)| 获取Form表单参数和原理分析
Golang Gin 实战(五)| 接收数组和map
Golang Gin 实战(四)| URL查询参数的获取和原理分析
Golang Gin 实战(三)| 路由参数
Golang Gin 实战(二)| 简便的Restful API 实现
Golang Gin 实战(一)| 快速安装入门
我有几个的Go语言交流微信群,可以扫码关注公众号flysnow_org
或者网站 https://www.flysnow.org/,加我好友,我拉你进来。