很多人推荐MEAN来开发站点。MEAN就是M:mongodb,E:expressjs、A:angular最后的N:nodejs。 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了。虽然说可以用promise等框架 破解深深的嵌套,但毕竟不是语言本身支持的。
为什么说用Golang呢?因为Golang是一个有着动态语言的特点的静态语言。语法简单,语法糖就是尽量减少语法。 编译的时候就可以把错误排查掉很多。不用像动态语言那样运行的时候才掉进坑里。
在Golang众多的Web框架中发现了Martini。 他后来觉得这个框架用了太多反射影响了效率,就有写了另一个框架或者按照作者的说法“中间件”, 叫做Negroni。具体的开发原因看这里。 可能是这个作者爱喝酒把他写的框架都叫了个酒水的名字。Margini这个框架是作者受了Expressjs的启发写出来的。 所以在很多使用上的东西非常类似,比如route的绑定语法,支持类中间件的绑定语法等。也看过Golang的其他框架比如Revel, 有很多的酷炫的功能,和一站式的很多的支持,但是因为Martini的灵活决定选用Margini。
数据库MongoDB
数据库方面,对于事物和数据的一致性要求没有那么强的话,还是选用比较简单的NoSQL数据库比较合适。所以,就用MongoDB了。 也许在严谨的工作中不应该这么用。但是MongoDB可以简单到,只要把Http POST过来的json数据直接写入数据库中。 如果json比较简单的话,完全不用做什么设计!当然,实际工作的时候是不可以这样的。我们讨论的只是这样的一个可行性。
那么我们就开始用Martini(golang)和MongoDB来打造一个web APP。这个app的名称就叫做navigator(领航者)。 是用来接受、存储和分析用户反馈以及用户的各种问题的,比如各种客户反馈回来的用户问题。这些问题的上下文信息十分有限。 所以我们让用户通过手机客户端来调用navigator的接口来同时提交相关的上下文信息。 关于Golang的一些基础的东西就不在这里探讨了。 go get获取Martini,下载MongoDB。之后使用命令run起来MongoDB。给DB起一个名字:NDB。然后在里面填充一个document。 MongoDB如果没有insert一个Document的话,那么这个数据库其实是没有创建的。这个Document就是一个Json。格式为:
{ "feedbackcode" : "123" , "username" : "" , "phonenum" : "" , "deviceinfo" : { "systemtype" : "" , "systemver" : "" , "appver" : "" } , "imagelist" : [ ] , "desc" : "testing" , "feedbacktype" : "" , "other" : "" }
使用feedbackCode
来标示一个唯一的feedback。数据库的问题就彻底解决了。
站点的目录结构
下面开始我们的站点部分。首先了解一下目录结构:
navigator |———conf |-————–Conf.go # 配置信息 |—————–ConfigError.go # 错误名称 |———controllers |—————–FeedbackController.go |—————–IndexController.go |–––models |––––––FeedbackModel.go server.go
这个目录结构式典型的REST API的MVC模式体现。我们这里不需要处理View,也就是Html的东西。但是, 还是显示的区分了Model和Controller。view其实还是有的,只不过是最后render后的json。
RUN起来
首先,让我们的web app跑起来。 给server.go添加如下的代码:
package main import "github.com/go-martini/martini" func main ( ) { m := martini . Classic ( ) m . Get ( "/" , func ( ) string { return "Hello world!" } ) m . Run ( ) }
go run server.go
命令就可以让这个web app运行起来了。默认的是运行在3000端口上的。 在页面上也只能看到光秃秃的几个字Hello world! martini.Classic()
调用之后,Martini会为你默认提供一些工具。其中最重要的一个就是路由。 在这之后就可以使用m.Get("/", func()string{return "Hello, world!"}
来指定什么路径映射到什么处理方法上。 最后调用m.Run()
方法在3000端口上运行整个app。
现在开始要真正的开发这个app了。首先我们需要有一个简单的需求分析,我们到底是要做什么。 如前所述,用户可以用这个API发送feedback上来,然后在另外一个接口里把这些内容以列表的形式展示出来。 需求就是这么简单。我们下面来一步一步实现这些功能。
Controllers
由于insert一个feedback,需要的信息量还是很大的。我们用POST得方法发送所需要的feedback数据。 所以,我们需要一个POST的路径和处理函数Handler(以后都叫做Handler)。
m . Post (