本文介绍golang中的优秀web开发框架martini!

Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架。Martini是一个专门用来处理Web相关内容的框架,其并没有自带有关ORM或详细的分层内容。所以当我们使用Martini作为我们的开发框架时,我们还需要选取适合的ORM等其他包。

安装

  1. go get github.com/codegangsta/martini

使用

我们可以使用如下的代码来测试我们安装的包是否是可用的:

  1. // server.go
  2. package main
  3. import "github.com/codegangsta/martini"
  4. func main() {
  5. m := martini.Classic()
  6. m.Get("/", func() string {
  7. return "Hello world!"
  8. })
  9. m.Run()
  10. }

在命令行中输入下面的命令运行上面的代码:

  1. go run server.go

接下来我们就可以使用如下的网址访问我们的应用:

  1. http://localhost:3000

说明:

  1. m := martini.Classic()创建一个典型的martini实例。
  2. m.Get("/", func() string { ... })接收对\的GET方法请求,第二个参数是对一请求的处理方法。
  3. m.Run()运行服务器。

API

(主要内容翻译自官方文档)

常量
下面的常量定义用于指定应用所处的环境:

  1. const (
  2. Dev string = "development"
  3. Prod string = "production"
  4. Test string = "test"
  5. )

变量

我们使用如下的变量来控制应用所处的环境:

  1. var Env = Dev

type BeforeFunc

BeforeFunc类型的方法在ResponseWriter方法被生效前调用。

  1. type BeforeFunc func(ResponseWriter)

如:

  1. BeforeFunc XXX(req ResponseWriter){
  2. // ...
  3. }

type ClassicMartini

带有典型方法的Martini实例类型。

  1. type ClassicMartini struct {
  2. *Martini
  3. Router
  4. }

func Classic() *ClassicMartini

我们可以使用这个方法创建一个典型的Martini实例。然后我们就可以使用这个Martini实例来进行应用的管理:

  1. func Classic() *ClassicMartini

type Context

Request请求的上下文内容。

  1. type Context interface {
  2. inject.Injector
  3. // Next is an optional function that Middleware Handlers can call to yield the until after
  4. // the other Handlers have been executed. This works really well for any operations that must
  5. // happen after an http request
  6. Next()
  7. // Written returns whether or not the response for this context has been written.
  8. Written() bool
  9. }
  10. ### type Handler
  11. Handler可以是任意的方法,Marniti会尝试注入服务到Handler方法的参数列表中。如果不能成功注入的话,Marnitipanic

type Handler interface{}
```

func Logger() Handler

Logger返回一个中间件处理器,用于记录request的请求输入与响应输出。

  1. func Logger() Handler

func Recovery() Handler

Recovery返回一个中间件,用于修复错误并在可能的情况下返回一个500给客户端。在开发模式的时候,Recovery会将错误信息输出为HTML页面。

  1. func Recovery() Handler

func Static(directory string, staticOpt ...StaticOptions) Handler

Static返回一个中间件处理器,用于服务给定目录的静态文件。

  1. func Static(directory string, staticOpt ...StaticOptions) Handler

type Martini

Martini实例是整个Web应用的顶层。inject.Injector方法在全局层面上映射服务。

  1. type Martini struct {
  2. inject.Injector
  3. // contains filtered or unexported fields
  4. }

func New() *Martini

创建包含全部功能的Martini实例。

  1. func New() *Martini

func (m *Martini) Action(handler Handler)

Action方法在所有的Martini中间件都被引入之后调用。在ClassicMartini中,是martini.Router。

  1. func (m *Martini) Action(handler Handler)

func (m *Martini) Handlers(handlers ...Handler)

设置给定的Handler处理方法栈。当处理器中存在不可调用的方法的时候,会产生异常。

  1. func (m *Martini) Handlers(handlers ...Handler)

func (m *Martini) Run()

获取http包中的server.Listening。默认使用os.GetEnv("PORT")或3000作为访问端口号.

  1. func (m *Martini) Run()

func (m Martini) ServeHTTP(res http.ResponseWriter, req http.Request)

ServeHTTP是Martini实例的入口。一般用于控制HTTP服务器。

  1. func (m *Martini) ServeHTTP(res http.ResponseWriter, req *http.Request)

func (m *Martini) Use(handler Handler)

将一个Handle处理方法添加到处理栈中。当处理方法不可用的时候会出现异常。

  1. func (m *Martini) Use(handler Handler)

type Params

已命名路由的键值对映射。一个martini.Params可以被注入到任意的路由处理方法中。

  1. type Params map[string]string

type ResponseWriter

ResponseWriter对http.ResponseWriter进行包装,它提供有关响应的扩展信息。如果以方法的形式调用,推荐使用这个中间件处理器来包装一个响应。

  1. type ResponseWriter interface {
  2. http.ResponseWriter
  3. http.Flusher
  4. // Status returns the status code of the response or 0 if the response has not been written.
  5. Status() int
  6. // Written returns whether or not the ResponseWriter has been written.
  7. Written() bool
  8. // Size returns the size of the response body.
  9. Size() int
  10. // Before allows for a function to be called before the ResponseWriter has been written to. This is
  11. // useful for setting headers or any other operations that must happen before a response has been written.
  12. Before(BeforeFunc)
  13. }

func NewResponseWriter(rw http.ResponseWriter) ResponseWriter

创建一个包装http.ResponseWriter的ResponseWriter类型实例。

  1. func NewResponseWriter(rw http.ResponseWriter) ResponseWriter

type ReturnHandler

ReturnHandler是Martini提供的用于路由处理并返回内容的服务。ReturnHandler对于向基于值传递的ResponseWriter写入是可响应的。

  1. type ReturnHandler func(Context, []reflect.Value)

type Route

Route是一个用于表示Martini路由层的接口。

  1. type Route interface {
  2. // URLWith returns a rendering of the Route's url with the given string params.
  3. URLWith([]string) string
  4. Name(string)
  5. }

type Router

Router是Martini的路由接口。提供HTTP变量、处理方法栈、依赖注入。

  1. type Router interface {
  2. // Get adds a route for a HTTP GET request to the specified matching pattern.
  3. Get(string, ...Handler) Route
  4. // Patch adds a route for a HTTP PATCH request to the specified matching pattern.
  5. Patch(string, ...Handler) Route
  6. // Post adds a route for a HTTP POST request to the specified matching pattern.
  7. Post(string, ...Handler) Route
  8. // Put adds a route for a HTTP PUT request to the specified matching pattern.
  9. Put(string, ...Handler) Route
  10. // Delete adds a route for a HTTP DELETE request to the specified matching pattern.
  11. Delete(string, ...Handler) Route
  12. // Options adds a route for a HTTP OPTIONS request to the specified matching pattern.
  13. Options(string, ...Handler) Route
  14. // Head adds a route for a HTTP HEAD request to the specified matching pattern.
  15. Head(string, ...Handler) Route
  16. // Any adds a route for any HTTP method request to the specified matching pattern.
  17. Any(string, ...Handler) Route
  18. // NotFound sets the handlers that are called when a no route matches a request. Throws a basic 404 by default.
  19. NotFound(...Handler)
  20. // Handle is the entry point for routing. This is used as a martini.Handler
  21. Handle(http.ResponseWriter, *http.Request, Context)
  22. }

func NewRouter() Router

创建一个路由实例。

  1. func NewRouter() Router

type Routes

Routes是Martini路由层的辅助服务。

  1. type Routes interface {
  2. // URLFor returns a rendered URL for the given route. Optional params can be passed to fulfill named parameters in the route.
  3. URLFor(name string, params ...interface{}) string
  4. // MethodsFor returns an array of methods available for the path
  5. MethodsFor(path string) []string
  6. }

type StaticOptions

StaticOptions是一个为martini.Static中间件指定配置选项的结构体。

  1. type StaticOptions struct {
  2. // Prefix is the optional prefix used to serve the static directory content
  3. Prefix string
  4. // SkipLogging can be used to switch log messages to *log.logger off.
  5. SkipLogging bool
  6. // IndexFile defines which file to serve as index if it exists.
  7. IndexFile string
  8. }

参考

  1. 官网
  2. @Github
  3. @GoDOC

『Golang』Martini框架入门的更多相关文章

  1. 『Scrapy』爬虫框架入门

    框架结构 引擎:处于中央位置协调工作的模块 spiders:生成需求url直接处理响应的单元 调度器:生成url队列(包括去重等) 下载器:直接和互联网打交道的单元 管道:持久化存储的单元 框架安装 ...

  2. 『Golang』Go简介以及环境搭建

    简介 go语言是由Google进行维护的一个编程语言,发布自2009年.其以良好的编程风格.优秀的并发机制被广大的技术人员所接受. 使用go语言开发的优秀的产品: Docker gocode lime ...

  3. 『C++』STL容器入门

    最近在学习opencv,因为C++基础很烂,所以遇到了不少问题,其中STL模块也是没少接触,特此简单了解一下STL的容器类型(主要是Vector)和迭代器的简单用法. C++ STL(标准模板库)是一 ...

  4. 『Golang』MongoDB在Golang中的使用(mgo包)

    有关在Golang中使用mho进行MongoDB操作的最简单的例子.

  5. 『Golang』在Golang中使用json

    由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ...

  6. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

  7. 『GoLang』协程与通道

    作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...

  8. 『GoLang』fmt包的使用

    目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...

  9. 『GoLang』string及其相关操作

    目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...

随机推荐

  1. C# 添加Windows服务,定时任务

    源码下载地址:http://files.cnblogs.com/files/lanyubaicl/20160830Windows%E6%9C%8D%E5%8A%A1.zip 步骤 一 . 创建服务项目 ...

  2. PLSQL_动态语句的解析(概念)

    2014-06-02 Created By BaoXinjian

  3. Linux内核同步 - classic RCU的实现

    一.前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟 ...

  4. Python2 元组 cmp() 方法

    描述 Python2 元组 cmp() 方法用于比较两个元组,如果 T1< T2返回 -1, 如果 T1== T2返回 0, 如果 T1> T2返回 1. 语法 cmp() 方法语法: c ...

  5. Win7没有telnet怎么办

    http://jingyan.baidu.com/article/8065f87fc3b31123312498e5.html

  6. js cookie库

    顺手摘下来 /** * @desc 设置Cookie * @param {String} name * @param {String} value * @param {Number} expires ...

  7. jquery插件Flot的简单讲解

    只是说一下基本用法,举一两个例子,详细用法请查看官方文档 使用方法是要先引入jquery插件,然后引入flot插件. <script type="text/javascript&quo ...

  8. unity5 Orthographic模式相机视截体尺寸计算

    一,通过编辑器中数值计算. 如图,相机为Orthographic模式,其camera size为5.57,是什么含义呢,经过测量,发现视图中视截体的高度是5.57x2. 那么视截体的宽度怎么决定呢? ...

  9. 关于 二维码 与 NFC 之间的出身贫贱说

    关于 二维码 与 NFC 之间的出身贫贱说 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  10. js方法call和apply实例解析

    在js编程中实现继承时 用到了两个很特殊的方法,call和apply. 在ECMAScript v3中,给Function原型定义了这两个方法,这两个方法的作用都是一样的:使用这两个方法可以像调用其他 ...