zoukankan      html  css  js  c++  java
  • Golang ECHO框架入门【1】

    一、介绍

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

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

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

    二、安装

    安装echo包

    go get github.com/labstack/echo/
    

    三、如何开始一个Http Server。

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

    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的主要的初始化工作就搞定了,只要添加自己的业务代码就行。

    四、项目结构

    通过上面的例子,知道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项目的打包。

    五、路由&控制器

    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请求go
    e.DELETE("/users/:id", deleteUser)
    

    2.控制器

    在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)
    }
    

    六、echo如何获取请求参数

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

    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>tizi365.com</title></head><body>欢迎访问tizi365.com</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
    
  • 相关阅读:
    [转] 敏捷软件开发 Agile Software Development
    Concurrent Framework Synchronizer 同步器: Easy to use but easy to make dead lock as well
    Concurrent Framework Timer
    JavaScript Return Object.Type
    Js AJAX Event
    js Functor Copy
    多线程19-线程池批量插入线程
    多线程18-QueueUserWorkItem
    多线程17-Async Programming Model
    多线程16-SpinWait
  • 原文地址:https://www.cnblogs.com/remixnameless/p/14318145.html
Copyright © 2011-2022 走看看