采用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中创建了如下的文件目录:
文件结构:
仔细看看,beego已经帮我们建立了诸如routers(路由),views(视图),controller(控制器),models(数据模型),static(静态文件),tests(测试用例)等文件夹和相应的.go文件了。Modoel,views和controller,依然是构建MVC模式的核心。
程序入口
设置beego框架启动的监听地址,端口号和程序名称等初始化行为。
智能路由routers
路由的主要功能是实现从请求地址到实现方法,通过实行路由注册,我们把请求分发到指定的控制器来执行相应的逻辑。
控制器controllers
根据路由分发的用户请求, controller会进行业务逻辑处理并返回响应信息。
基于beego的Controller设计,只需要匿名组合beego.Controller就可以实现beego controller了所有接口了。
由于用beego框架默认只重写一个Get函数(打开浏览器里即可看到demo),而这次例子中pc客户端提交的是post请求,所以要通过子struct的方法来重写post函数,实现自己的逻辑。这里可以先看看controller.go的源码:
Post()
如果用户请求的HTTP Method是POST, 那么就执行该函数,默认是405,用户继承的子struct中可以重新实现了该方法以处理Post请求。
结果截图
请求
响应
源代码可访问我的github.com:beego-httpserver-test
为了更好地熟悉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
相关文章推荐
- atitit.交换机 汇聚上联、网络克隆和标准共享的原理与区别
- atitit.交换机 汇聚上联、网络克隆和标准共享的原理与区别
- JAVA SSL HTTPS 连接详解 生成证书
- TCP segment of a reassembled PDU
- 网络协议——IP
- http请求下载文件
- atitit.交换机 汇聚上联、网络克隆和标准共享的原理与区别
- UVA-10806 Dijkstra, Dijkstra. (最小费用流,网络流建模)
- HTTP消息头网页缓存控制以及header常用指令
- Android 一个改善的okHttp封装库
- HTTP常见错误 400 401 403 404 405 406 407 412 414 500 501 502
- 网络层到运输层
- C#通过WebClient/HttpWebRequest实现http的post/get方法与java对接
- tcpdump
- https+ssl详解
- android httpPost 的请求
- 网络推广
- 一个优秀的http实现框架
- 客户端认证自签名HTTPS证书
- HTTP 请求工具类