go get github.com/labstack/echo/
package main
import (
"net/http"
//导入echo包
"github.com/labstack/echo"
)
func main() {
//实例化echo对象。
e := echo.New()
//注册一个Get请求, 路由地址为: /hello 并且绑定一个控制器函数, 这里使用的是闭包函数。
e.GET("/hello", func(c echo.Context) error {
//控制器函数直接返回一个字符串,http响应状态为http.StatusOK,就是200状态。
return c.String(http.StatusOK, "hello echo")
})
//启动http server, 并监听8080端口,冒号(:)前面为空的意思就是绑定网卡所有Ip地址,本机支持的所有ip地址都可以访问。
e.Start(":8080")
}
运行http server
$ go run httpserver.go
通过浏览器访问 http://localhost:8080/hello 浏览器会显示: hello echo
echo web框架的代码非常简洁,就几行代码一个http server的主要的初始化工作就搞定了,只要添加自己的业务代码就行。
├── 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项目的打包。
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请求go
e.DELETE("/users/:id", deleteUser)
在echo框架中,控制器是一个函数,需要根据业务实现各种控制器函数,控制器函数定义如下:
//控制器函数只接受一个echo.Context上下文参数
//参数:c 是上下文参数,关联了当前请求和响应,通过c参数可以获取请求参数,向客户端响应结果。
func HandlerFunc(c echo.Context) error
func getUser(c echo.Context) error {
// 方式1:获取url上的path参数,url模式里面定义了参数:id
id := c.Param("id")
//方式2:获取query参数,例如:/users?username=tizi365&type=2
username := c.QueryParam("username") //值为:"tizi365"
usertype := c.QueryParam("type") //值为:"2"
//方式3:获取post请求的表单参数
username := c.FormValue("username")
usertype := c.FormValue("type")
return c.String(http.StatusOK, "获取参数例子")
}
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, "tizi365"}
return c.JSON(http.StatusOK, u) //返回结果:{"id":2,"username":"tizi365"}
//方式3: 返回HTML
//以网页形式返回html代码,c.HTML语法: c.HTML(http状态码, "html内容")
html := "<html><head><title>编程学习网</title></head><body>欢迎访问编程学习网</body></html>"
//当然实际项目,不会这样拼写html代码,太麻烦,一会使用模板引擎处理Html代码,然后把结果通过c.HTML返回给客户端就行。
return c.HTML(http.StatusOK, html)
}
对于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
Go(又称Golang)是Google开发的一种静态强类型、编
Docker是一个开源的应用容器引擎,基于GO语言,让
beego是一个快速开发Go应用的http框架,go 语言方面
Buffalo是Go语言的Web开发框架,类似 Python的Flask框
echo web框架是go语言开发的一种高性能,可扩展,
Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,
Iris是一个通过GO编写的快速的,简单的,但是功
Revel是一个Go语言的web框架,其具有热编译,高性