Echo框架的学习和在项目中的初阶使用 | 青训营笔记

155 阅读2分钟
这是我参与「第五届青训营」伴学笔记创作活动的第 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说明函数被调用了。

demo.png

如果没有的话可以打开系统的防火墙,并允许刚刚编译好的程序通过防火墙。

firewall.png

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路径末尾的斜杆"/",有时需要加上,有时不需要,需要与前端沟通或者自己手动测试得知。