本章介绍处理完http请求后如何响应请求(就是怎么返回处理结果),echo框架支持以字符串、json、xml、文件等格式响应请求。
echo.Context 上下文对象支持多种返回处理结果,下面分别介绍不同的响应方式。
1.以字符串方式响应请求
函数定义:
String(code int, s string) error
参数说明:
参数 | 说明 |
---|---|
code | http状态码 |
s | 返回结果 |
例子:
func(c echo.Context) error {
//http.StatusOK == 200
return c.String(http.StatusOK, "欢迎访问tizi360.com!")
//也可以直接设置http状态码
//return c.String(200, "欢迎访问tizi360.com!")
}
提示: net/http包定义了多种常用的状态码常量,例如:http.StatusOK == 200, http.StatusMovedPermanently == 301, http.StatusNotFound == 404等,具体可以参考net/http包
2.以json格式响应请求
函数定义:
JSON(code int, i interface{}) error
参数说明:
参数 | 说明 |
---|---|
code | http状态码 |
i | 返回结果对象,通常传入struct对象 |
例子:
// User 定义
type User struct {
Name string `json:"name"` // 通过json标签定义struct字段转换成json字段的名字。
Email string `json:"email"`
}
// Handler 控制器
func(c echo.Context) error {
//初始化user对象
u := &User{
Name: "tizi365",
Email: "tizi@tizi365.com",
}
//返回json数据
//返回结果:{"name":"tizi365", "email":"tizi@tizi365.com"}
return c.JSON(200, u)
}
3.以xml格式响应请求
函数定义:
XML(code int, i interface{}) error
参数说明:
参数 | 说明 |
---|---|
code | http状态码 |
i | 返回结果对象,通常传入struct对象 |
例子:
// User 定义, 默认struct的名字就是xml的根节点名字,这里转换成xml后根节点的名字为User.
type User struct {
Name string `xml:"name"` // 通过xml标签定义struct字段转换成xml字段的名字。
Email string `xml:"email"`
}
// Handler 控制器
func(c echo.Context) error {
//初始化user对象
u := &User{
Name: "tizi365",
Email: "tizi@tizi365.com",
}
//返回json数据
//返回结果:
// <?xml version="1.0" encoding="UTF-8"?>
// <User><name>tizi365</name><email>tizi@tizi365.com</email></User>
return c.XML(200, u)
}
4.以文件格式响应请求
如果我们需要实现文件下载功能,可以直接返回文件。
echo支持多种方式返回文件:
例子1:
func(c echo.Context) error {
//通过File函数,直接返回本地文件,参数为本地文件地址。
//函数说明:c.File("文件路径")
return c.File("/var/www/1.jpg")
}
例子2:
func(c echo.Context) error {
//通过Attachment函数,返回本地文件,类似File函数,区别是可以指定下载的文件名。
//函数说明: c.Attachment("文件路径", "下载的文件名")
return c.Attachment("/var/www/1.jpg", "1.jpg")
}
例子3:
func(c echo.Context) (err error) {
data := []byte(`0306703,0035866,NO_ACTION,06/19/2006
0086003,"0005866",UPDATED,06/19/2006`)
//通过Blob函数,以二进制数据格式返回文件
//函数说明:c.Blob(状态码, "contentType", byte数组)
return c.Blob(http.StatusOK, "text/csv", data)
}
例子4:
func(c echo.Context) error {
//打开文件
f, err := os.Open("/var/www/1.jpg")
if err != nil {
return err
}
//通过Stream函数,以stream流的方式返回文件
//函数说明:
//Stream(code int, contentType string, r io.Reader) error
//参数说明:
// code - 状态码
// contentType - html内容类型
// r - 实现io.Reader接口的struct对象都可以直接输出内容
return c.Stream(http.StatusOK, "image/png", f)
}
5.设置http响应头(设置Header)
func(c echo.Context) error {
//设置http响应 header
c.Response().Header().Add("tizi", "tizi365")
return c.String(200, "欢迎访问tizi360.com!")
}