这是我参与「第五届青训营」伴学笔记创作活动的第 5 天
Echo框架简介和安装
Echo是Go语言的一个高性能的可扩展Web框架,可以作为Web服务端框架使用。
使用go get命令安装:
go get -u github.com/labstack/echo/...
快速上手
首先写一个简单的HelloWorld程序验证是否安装正确。
package main
import (
"fmt"
"github.com/labstack/echo"
"net/http"
)
func main() {
e := echo.New()
e.GET("/hello", func(c echo.Context) error {
fmt.Println("Called")
return c.String(http.StatusOK, "Hello, Echo!")
})
e.Start(":1234")
}
编译运行。
在浏览器地址栏输入
localhost:1234/hello
按回车键即可看到服务端返回的字符串"Hello, Echo!",同时控制台会打印一个Called说明函数被调用了。
如果没有的话可以打开系统的防火墙,并允许刚刚编译好的程序通过防火墙。
Echo框架的基本用法
请求和响应
接收前端的请求和返回响应是服务端最基本的功能。
请求
要接收请求需要先定义一个符合请求格式的结构体,再创建一个该结构体类型的变量,使用Bind方法绑定数据。
type Req struct{
s string `json:"s"`
}
func main() {
e := echo.New()
e.GET("/hello", func(c echo.Context) error {
var req Req
c.Bind(&req)
fmt.Println(req.s)
return c.String(http.StatusOK, req.s+" Hello, Echo!")
})
e.Start(":1234")
}
响应
通过上下文的HTML方法可以响应一个HTML响应。
JSON方法响应JSON数据
当有大量JSON数据时应该使用JSON流。
JSON Pretty可以发送带有缩进的JSON数据。
常用的还有XML方法等。
路由
概念
通过指定HTTP方法,URL路径和一个处理请求的函数可以注册一个路由。
func Service1(c echo.Context) error {
var req Req
c.Bind(&req)
fmt.Println(req.s)
return c.String(http.StatusOK, req.s+" Hello, Echo!")
}
func main() {
e := echo.New()
e.GET("/hello/service1/",Service1)
e.Start(":1234")
}
路由组
将具有相同前缀的路由归为一组即可构成路由组。
使用Group方法。
错误处理
使用中间件或者处理程序集中处理错误。
比如可以用NewHTTPError方法返回一个错误。
echo.NewHTTPError(http.StatusForbidden)
也可以用HTTPErrorHandler设置自定义的错误处理程序。
项目实际应用
HTTP请求的接收和响应一般放在controller层。
比如对评论操作请求的响应
func (c *CommentService) CommentAction(con echo.Context) error {
// 从上下文获取请求
var commentRequestData CommentParam
if err := con.Bind(&commentRequestData); err != nil {
return err
}
// 判断是发表评论(1),还是删除评论(2)
if commentRequestData.ActionType == "1" {
//发表评论的服务
// 评论服务的请求参数
// 返回响应
if err := (*con).JSON(http.StatusOK, commentResponseData); err != nil {
return err
}
} else if commentRequestData.ActionType == "2" {
// 删除评论
// 评论服务的请求参数
// 返回响应的服务
if err := con.JSON(http.StatusOK, res); err != nil {
return err
}
}
return nil
}
通过定义多个controller接口,再同意注册路由或者路由组即可实现对不同请求的响应。
使用时还需注意URL路径末尾的斜杆"/",有时需要加上,有时不需要,需要与前端沟通或者自己手动测试得知。