采用beego框架构建 http服务器

     beego是一个使用 Go 的思维来快速构建并开发 Go 应用程序的开源http框架,作者是谢孟军。它可以快速开发API、Web、后端服务等各种应用,功能支持RESTFul,MVC模型;含有智能路由,内置强大模块,采用了 Go 原生的 http 包来处理请求;goroutine 的并发效率足以应付大流量的 Web 应用和 API 应用等等,可谓是简单易用,十分强大。
     为了更好地熟悉beego框架,现在来构建一个简单的http服务器, PC客户端通过http协议post请求通信,并获取服务器返回的信息。假设beego开发环境已安装好,如果有疑问,可以参考之前写的一篇blog:。Go语言beego框架环境搭建
     我的beego工程名为ocean,GOPATH=E:\work\ocean。
     通信流程
     采用beego框架构建 http服务器_第1张图片

     新建项目
     通过“bee new 工程”命令,在GOPATH\src\ocean中创建了如下的文件目录:
     采用beego框架构建 http服务器_第2张图片

     文件结构:

ocean    
├── conf   
|   └── app.conf
├── controllers
|    └── default.go
├── main.go
├── models
├── routers   
|    └── router.go
├── static
│   ├── css
│   ├── img
│   └── js
├── tests
│   └── default_test.go
└── views    
└── index.tpl

     仔细看看,beego已经帮我们建立了诸如routers(路由),views(视图),controller(控制器),models(数据模型),static(静态文件),tests(测试用例)等文件夹和相应的.go文件了。Modoel,views和controller,依然是构建MVC模式的核心。
     程序入口
     设置beego框架启动的监听地址,端口号和程序名称等初始化行为。

main.go代码:
package main

import (
    "github.com/astaxie/beego"
    _ "ocean/routers"
)

func main() {
    //beego全局变量
    beego.CopyRequestBody = true
    beego.AppName = "ocean"

    //设置http地址
    beego.HttpAddr = "127.0.0.1"
    //设置http端口号
    beego.HttpPort = 5170

    //无参数,默认default run on HttpPort
    beego.Run()
}
//包含_ "ocean/routers",会执行router.go的init函数。

     智能路由routers
     路由的主要功能是实现从请求地址到实现方法,通过实行路由注册,我们把请求分发到指定的控制器来执行相应的逻辑。

router.go
func init() {
        //用户就可以通过访问url“/ocean”(用户请求的地址) 去执行 OceanController 的逻辑
    beego.Router("/ocean", &controllers.OceanController{})
}

     控制器controllers
     根据路由分发的用户请求, controller会进行业务逻辑处理并返回响应信息。
基于beego的Controller设计,只需要匿名组合beego.Controller就可以实现beego controller了所有接口了。

type xxxController struct {
    beego.Controller
}

     由于用beego框架默认只重写一个Get函数(打开浏览器里即可看到demo),而这次例子中pc客户端提交的是post请求,所以要通过子struct的方法来重写post函数,实现自己的逻辑。这里可以先看看controller.go的源码:

Controller.go
// Post adds a request function to handle POST request.
func (c *Controller) Post() {
    http.Error(c.Ctx.ResponseWriter, "Method Not Allowed", 405)
}

     Post()
     如果用户请求的HTTP Method是POST, 那么就执行该函数,默认是405,用户继承的子struct中可以重新实现了该方法以处理Post请求。

controller代码:
default.go
type OceanController struct {
    beego.Controller
}

func (c *OceanController) Get() {
    c.Data["Website"] = "beego.me"
    c.Data["Email"] = "[email protected]"
    c.TplNames = "index.tpl"
}

//通过子struct的方法来重写post函数,实现自己的逻辑。
func (c *OceanController) Post() {

    var req map[string]interface{}
    var res map[string]interface{}

    //请求信息
    bufReq := c.Ctx.Input.RequestBody
    json.Unmarshal(bufReq, &req)
    //返回响应结果
    lenReq := len(bufReq)
    if lenReq > 1024 {
        beego.Info("req:", "\n"+string(bufReq[:64]), "...", string(bufReq[lenReq-64:]), "\n")
    } else {
        beego.Info("req:", "\n"+string(bufReq), "\n")
    }

    //模拟处理客户端发来的请求消息
    res = c.HandleReq(bufReq)

    bufRes, _ := json.MarshalIndent(res, "", "  ")
    lenRes := len(bufRes)
    if lenRes > 1024 {
        beego.Info("res:", "\n"+string(bufRes[:32]), "...", string(bufRes[lenRes-64:]), "\n")
    } else {
        beego.Info("res:", "\n"+string(bufRes), "\n")
    }

    c.Data["json"] = res
    c.ServeJson(false)
}

//-- 处理客户端发来的请求消息
//-- 参数:json数据,
func (c *OceanController) HandleReq(jsonData []byte) map[string]interface{} {

    var res map[string]interface{}

    json.Unmarshal(jsonData, &res)
    res["ver"] = 2
    res["cmd"] = "sys.pong"

    return res
}

     结果截图
     请求
     采用beego框架构建 http服务器_第3张图片
     采用beego框架构建 http服务器_第4张图片
     响应
     采用beego框架构建 http服务器_第5张图片
     采用beego框架构建 http服务器_第6张图片

     源代码可访问我的github.com:beego-httpserver-test

你可能感兴趣的:(Go)