您的位置:首页 > 理论基础 > 计算机网络

采用beego框架构建 http服务器

2015-12-15 17:40 676 查看
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。

通信流程



新建项目

通过“bee new 工程”命令,在GOPATH\src\ocean中创建了如下的文件目录:



文件结构:

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"] = "astaxie@gmail.com"
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
}


结果截图

请求





响应





源代码可访问我的github.com:beego-httpserver-test
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: