golang echo框架入门教程

1. golang echo框架介绍

echo web框架是go语言开发的一种高性能,可扩展,轻量级的web框架。
echo框架真的非常简单,几行代码就可以启动一个高性能的http服务端。

如果你只是测试返回hello world这种简单逻辑,普通的低配服务器,每秒扛个万八千QPS没什么问题,这个主要跟服务器配置有关,当然实际应用中我们的业务逻辑不会是hello world那么简单,业务不同,系统设计不同吞吐量肯定不一样。

echo框架默认其实只包含了MVC框架的C部分,就是负责url路由和控制器部分。至于V视图部分和M数据操作部分我们可以随意使用自己喜欢的工具库来操作。

2. golang echo框架安装

安装echo包

go get github.com/labstack/echo/...
go get github.com/labstack/echo/...

安装指定版本

// go get github.com/labstack/echo/{version}
go get github.com/labstack/echo/v4

3. 如何开始一个Http Server

创建httpserver.go文件,代码如下:

package main

import (
    "net/http"
    //导入echo包或者echo v4包
    "github.com/labstack/echo"
    //"github.com/labstack/echo/v4"
)

func main() {
    //实例化echo对象。
    e := echo.New()

    //路由
    //注册一个Get请求, 路由地址为: /hello  并且绑定一个控制器函数 
    e.GET("/hello", hello)

    //路由绑定闭包函数
    e.GET("/", func(c echo.Context) error {
        //控制器函数直接返回一个字符串,http响应状态为http.StatusOK,就是200状态。
        return c.String(http.StatusOK, "This is index.")
    })

    //启动http server, 并监听8080端口,冒号(:)前面为空的意思就是绑定网卡所有Ip地址,本机支持的所有ip地址都可以访问。
    e.Start(":8080")
}

//控制器函数示例
func hello(c echo.Context) error {
    return c.String(http.StatusOK, "Hello, World!")
}

运行http server

go run httpserver.go

通过浏览器访问 http://localhost:8080/hello 浏览器会显示:Hello, World!

echo web框架的代码非常简洁,就几行代码一个http server的主要的初始化工作就搞定了,只要添加自己的业务代码就行。

4. 常见项目结构

通过上面的例子,大家都知道echo大致是怎么使用的,但是实际项目业务功能会很多,我们不可能把所有代码都写在一个go文件里面或者写在一个main入口函数里面;我们需要对项目结构做一些规划,方便维护代码以及扩展。

echo web框没有对项目结构做出限制,我们可以根据自己项目需要自行设计。

这里给出一个典型的MVC框架大致的项目结构的例子,大家可以参考下:

├── conf                    #项目配置文件目录
│   └── config.toml         #大家可以选择自己熟悉的配置文件管理工具包例如:toml、xml等等
├── controllers             #控制器目录,按模块存放控制器,必要的时候可以继续划分子目录。
│   ├── food.go
│   └── user.go
├── main.go                 #项目入口,这里负责echo框架的初始化,注册路由信息,关联控制器函数等。
├── models                  #模型目录,负责项目的数据存储部分,例如各个模块的Mysql表的读写模型。
│   ├── food.go
│   └── user.go
├── static                  #静态资源目录,包括Js,css,jpg等等,可以通过echo框架配置,直接让用户访问。
│   ├── css
│   ├── images
│   └── js
├── logs                    #日志文件目录,主要保存项目运行过程中产生的日志。
└── views                   #视图模板目录,存放各个模块的视图模板,当然有些项目只有api,是不需要视图部分,可以忽略这个目录
    └── index.html

提示:上面给出的项目结构,程序编译打包后代码都编译成一个可执行程序,我们需要把conf,static, logs目录一起打包部署,否则程序会找不到配置文件,静态文件,日志存储目录,后面会有专门的教程介绍go项目的打包。

5. 路由和控制器

5.1 路由

echo框架的路由定义如下:

//定义post请求, url为:/users, 绑定saveUser控制器函数
e.POST("/users", saveUser)

//定义get请求,url模式为:/users/:id  (:id是参数,例如: /users/10, 会匹配这个url模式),绑定getUser控制器函数
e.GET("/users/:id", getUser)

//定义put请求
e.PUT("/users/:id", updateUser)

//定义delete请求
e.DELETE("/users/:id", deleteUser)

// 例子1, 静态Url路径, 即不带任何参数的url路径
/users/center
/user/101
/food/100

// 例子2,带路径参数的url路径,url路径上面带有参数,参数由冒号(:)跟着一个字符串定义。
// 路径参数值可以是数值,也可以是字符串

//定义参数:id, 可以匹配/user/1, /user/899 /user/xiaoli 这类Url路径
/user/:id

//定义参数:id, 可以匹配/food/2, /food/100 /food/apple 这类Url路径
/food/:id

//定义参数:type和:page, 可以匹配/foods/2/1, /food/100/25 /food/apple/30 这类Url路径
/foods/:type/:page

// 例子3. 带星号(*)模糊匹配参数的url路径
// 星号代表匹配任意路径的意思

//匹配:/foods/1, /foods/200, /foods/1/20, /foods/apple/1 
//以/foods/ 开头的所有路径都匹配
/foods/*

5.2 Url路径匹配顺序

上面列出了三种Url路径的写法,那么如果我们项目里面三种路径都有使用,而且出现一个http请求匹配多种路径的时候,echo框架选择哪个路径呢?

例如:一个http Get请求的路径为 /user/10

同时匹配下面三种url路径定义:

/user/10
/user/:id
/user/*

如果出现上述,一个http请求路径匹配多个定义的url路径,echo框架按下面顺序匹配,先匹配到那个就用那个定义。

匹配静态url路径
匹配带路径参数的url路径
匹配带星号(*)模糊匹配参数的url路径

5.3 控制器

在echo框架中,控制器是一个函数,我们需要根据业务实现各种控制器函数,控制器函数定义如下:

//控制器函数只接受一个echo.Context上下文参数
//参数:c 是上下文参数,关联了当前请求和响应,通过c参数我们可以获取请求参数,向客户端响应结果。
func HandlerFunc(c echo.Context) error

例子:

// 路由定义:e.GET("/users/:id", getUser)
// getUser控制器函数实现
func getUser(c echo.Context) error {
    // 获取url上的path参数,url模式里面定义了参数:id
    id := c.Param("id")

    //响应一个字符串,这里直接把id以字符串的形式返回给客户端。
    return c.String(http.StatusOK, id)
}

//控制器函数实现示例
func saveUser(c echo.Context) error {
    ...忽略实现...
}

func updateUser(c echo.Context) error {
    ...忽略实现...
}

func deleteUser(c echo.Context) error {
    ...忽略实现...
}

提示:实际项目开发中不要把路由定义和控制器函数都写在一个go文件,不方便维护,可以参考第一章的项目结构,规划自己的业务模块。

6. echo获取请求参数和响应请求

6.1 echo如何获取请求参数

控制获取请求参数的例子:

func getUser(c echo.Context) error {
    // 方式1:获取url上的path参数,url模式里面定义了参数:id
    id := c.Param("id")

    //方式2:获取query参数,例如:/users?username=admin&type=2
    username := c.QueryParam("username")  //值为:"admin"
    usertype := c.QueryParam("type")      //值为:"2"

    //方式3:获取post请求的表单参数
    username := c.FormValue("username")
    usertype := c.FormValue("type")

    return c.String(http.StatusOK, "获取参数例子")
}

6.2 响应请求

echo框架支持以文本、html、Json、xml多种格式的内容形式响应Http请求。

控制器响应请求的例子:

type User struct {
    Id       int
    Username string
}

func getUser(c echo.Context) error {
    //方式1: 返回字符串
    //以字符串的形式返回,c.String语法:c.String(http状态码,"字符串内容")
    return c.String(http.StatusOK, "获取参数例子")

    //方式2:返回JSON
    //以json字符串的形式返回结果,c.JSON语法: c.JSON(http状态码, 结构体变量)
    u := User{2, "admin"}
    return c.JSON(http.StatusOK, u) //返回结果:{"id":2,"username":"admin"}

    //方式3: 返回HTML
    //以网页形式返回html代码,c.HTML语法: c.HTML(http状态码, "html内容")
    html := "<html><head><title>l1mn.com</title></head><body>欢迎访问l1mn.com</body></html>"
    //当然实际项目,我们不会这样拼写html代码,太麻烦,我们一会使用模板引擎处理Html代码,然后把结果通过c.HTML返回给客户端就行。
    return c.HTML(http.StatusOK, html)

}

6.3 如何展示静态内容

对于js、css、png、jpg这些静态内容,echo框架通过一个配置就可以实现静态资源的展示。

例子:

e := echo.New()

...忽略其他初始化代码...

//设置静态资源url前缀和目录
//这里设置 /static 为静态资源url的前缀,当前程序运行目录下面的static目录为静态资源目录
e.Static("/static", "static")

//例如:static目录下存在js/index.js文件, 则这个js的url为:/static/js/index.js

出处:www.l1mn.com

原文标题:golang echo框架入门教程

原文地址:https://www.l1mn.com/p/w6urp4.html

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

评论

皖ICP备2023023451号

Copyright © L1MN.COM 联系方式:l1mnfw@163.com