『Golang』Martini框架入门
本文介绍golang中的优秀web开发框架martini!
序
Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架。Martini是一个专门用来处理Web相关内容的框架,其并没有自带有关ORM或详细的分层内容。所以当我们使用Martini作为我们的开发框架时,我们还需要选取适合的ORM等其他包。
安装
go get github.com/codegangsta/martini
使用
我们可以使用如下的代码来测试我们安装的包是否是可用的:
// server.go
package main
import "github.com/codegangsta/martini"
func main() {
m := martini.Classic()
m.Get("/", func() string {
return "Hello world!"
})
m.Run()
}
在命令行中输入下面的命令运行上面的代码:
go run server.go
接下来我们就可以使用如下的网址访问我们的应用:
http://localhost:3000
说明:
- m := martini.Classic()创建一个典型的martini实例。
- m.Get("/", func() string { ... })接收对\的GET方法请求,第二个参数是对一请求的处理方法。
- m.Run()运行服务器。
API
(主要内容翻译自官方文档)
常量
下面的常量定义用于指定应用所处的环境:
const (
Dev string = "development"
Prod string = "production"
Test string = "test"
)
变量
我们使用如下的变量来控制应用所处的环境:
var Env = Dev
type BeforeFunc
BeforeFunc类型的方法在ResponseWriter方法被生效前调用。
type BeforeFunc func(ResponseWriter)
如:
BeforeFunc XXX(req ResponseWriter){
// ...
}
type ClassicMartini
带有典型方法的Martini实例类型。
type ClassicMartini struct {
*Martini
Router
}
func Classic() *ClassicMartini
我们可以使用这个方法创建一个典型的Martini实例。然后我们就可以使用这个Martini实例来进行应用的管理:
func Classic() *ClassicMartini
type Context
Request请求的上下文内容。
type Context interface {
inject.Injector
// Next is an optional function that Middleware Handlers can call to yield the until after
// the other Handlers have been executed. This works really well for any operations that must
// happen after an http request
Next()
// Written returns whether or not the response for this context has been written.
Written() bool
}
### type Handler
Handler可以是任意的方法,Marniti会尝试注入服务到Handler方法的参数列表中。如果不能成功注入的话,Marniti会panic。
type Handler interface{}
```
func Logger() Handler
Logger返回一个中间件处理器,用于记录request的请求输入与响应输出。
func Logger() Handler
func Recovery() Handler
Recovery返回一个中间件,用于修复错误并在可能的情况下返回一个500给客户端。在开发模式的时候,Recovery会将错误信息输出为HTML页面。
func Recovery() Handler
func Static(directory string, staticOpt ...StaticOptions) Handler
Static返回一个中间件处理器,用于服务给定目录的静态文件。
func Static(directory string, staticOpt ...StaticOptions) Handler
type Martini
Martini实例是整个Web应用的顶层。inject.Injector方法在全局层面上映射服务。
type Martini struct {
inject.Injector
// contains filtered or unexported fields
}
func New() *Martini
创建包含全部功能的Martini实例。
func New() *Martini
func (m *Martini) Action(handler Handler)
Action方法在所有的Martini中间件都被引入之后调用。在ClassicMartini中,是martini.Router。
func (m *Martini) Action(handler Handler)
func (m *Martini) Handlers(handlers ...Handler)
设置给定的Handler处理方法栈。当处理器中存在不可调用的方法的时候,会产生异常。
func (m *Martini) Handlers(handlers ...Handler)
func (m *Martini) Run()
获取http包中的server.Listening。默认使用os.GetEnv("PORT")或3000作为访问端口号.
func (m *Martini) Run()
func (m Martini) ServeHTTP(res http.ResponseWriter, req http.Request)
ServeHTTP是Martini实例的入口。一般用于控制HTTP服务器。
func (m *Martini) ServeHTTP(res http.ResponseWriter, req *http.Request)
func (m *Martini) Use(handler Handler)
将一个Handle处理方法添加到处理栈中。当处理方法不可用的时候会出现异常。
func (m *Martini) Use(handler Handler)
type Params
已命名路由的键值对映射。一个martini.Params可以被注入到任意的路由处理方法中。
type Params map[string]string
type ResponseWriter
ResponseWriter对http.ResponseWriter进行包装,它提供有关响应的扩展信息。如果以方法的形式调用,推荐使用这个中间件处理器来包装一个响应。
type ResponseWriter interface {
http.ResponseWriter
http.Flusher
// Status returns the status code of the response or 0 if the response has not been written.
Status() int
// Written returns whether or not the ResponseWriter has been written.
Written() bool
// Size returns the size of the response body.
Size() int
// Before allows for a function to be called before the ResponseWriter has been written to. This is
// useful for setting headers or any other operations that must happen before a response has been written.
Before(BeforeFunc)
}
func NewResponseWriter(rw http.ResponseWriter) ResponseWriter
创建一个包装http.ResponseWriter的ResponseWriter类型实例。
func NewResponseWriter(rw http.ResponseWriter) ResponseWriter
type ReturnHandler
ReturnHandler是Martini提供的用于路由处理并返回内容的服务。ReturnHandler对于向基于值传递的ResponseWriter写入是可响应的。
type ReturnHandler func(Context, []reflect.Value)
type Route
Route是一个用于表示Martini路由层的接口。
type Route interface {
// URLWith returns a rendering of the Route's url with the given string params.
URLWith([]string) string
Name(string)
}
type Router
Router是Martini的路由接口。提供HTTP变量、处理方法栈、依赖注入。
type Router interface {
// Get adds a route for a HTTP GET request to the specified matching pattern.
Get(string, ...Handler) Route
// Patch adds a route for a HTTP PATCH request to the specified matching pattern.
Patch(string, ...Handler) Route
// Post adds a route for a HTTP POST request to the specified matching pattern.
Post(string, ...Handler) Route
// Put adds a route for a HTTP PUT request to the specified matching pattern.
Put(string, ...Handler) Route
// Delete adds a route for a HTTP DELETE request to the specified matching pattern.
Delete(string, ...Handler) Route
// Options adds a route for a HTTP OPTIONS request to the specified matching pattern.
Options(string, ...Handler) Route
// Head adds a route for a HTTP HEAD request to the specified matching pattern.
Head(string, ...Handler) Route
// Any adds a route for any HTTP method request to the specified matching pattern.
Any(string, ...Handler) Route
// NotFound sets the handlers that are called when a no route matches a request. Throws a basic 404 by default.
NotFound(...Handler)
// Handle is the entry point for routing. This is used as a martini.Handler
Handle(http.ResponseWriter, *http.Request, Context)
}
func NewRouter() Router
创建一个路由实例。
func NewRouter() Router
type Routes
Routes是Martini路由层的辅助服务。
type Routes interface {
// URLFor returns a rendered URL for the given route. Optional params can be passed to fulfill named parameters in the route.
URLFor(name string, params ...interface{}) string
// MethodsFor returns an array of methods available for the path
MethodsFor(path string) []string
}
type StaticOptions
StaticOptions是一个为martini.Static中间件指定配置选项的结构体。
type StaticOptions struct {
// Prefix is the optional prefix used to serve the static directory content
Prefix string
// SkipLogging can be used to switch log messages to *log.logger off.
SkipLogging bool
// IndexFile defines which file to serve as index if it exists.
IndexFile string
}
参考
『Golang』Martini框架入门的更多相关文章
- 『Scrapy』爬虫框架入门
框架结构 引擎:处于中央位置协调工作的模块 spiders:生成需求url直接处理响应的单元 调度器:生成url队列(包括去重等) 下载器:直接和互联网打交道的单元 管道:持久化存储的单元 框架安装 ...
- 『Golang』Go简介以及环境搭建
简介 go语言是由Google进行维护的一个编程语言,发布自2009年.其以良好的编程风格.优秀的并发机制被广大的技术人员所接受. 使用go语言开发的优秀的产品: Docker gocode lime ...
- 『C++』STL容器入门
最近在学习opencv,因为C++基础很烂,所以遇到了不少问题,其中STL模块也是没少接触,特此简单了解一下STL的容器类型(主要是Vector)和迭代器的简单用法. C++ STL(标准模板库)是一 ...
- 『Golang』MongoDB在Golang中的使用(mgo包)
有关在Golang中使用mho进行MongoDB操作的最简单的例子.
- 『Golang』在Golang中使用json
由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ...
- 『Golang』—— 标准库之 os
Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...
- 『GoLang』协程与通道
作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...
- 『GoLang』fmt包的使用
目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...
- 『GoLang』string及其相关操作
目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...
随机推荐
- .Net4.0 任务(Task)[转]
.Net4.0 任务(Task) 任务(Task)是一个管理并行工作单元的轻量级对象.它通过使用CLR的线程池来避免启动专用线程,可以更有效率的利用线程池.System.Threading.Tasks ...
- iOS - Label 数字动态变化
1.数字动态变化 具体实现代码见 GitHub 源码 QExtension QCountingLabel.h /// 文本数字变化方式枚举 typedef NS_ENUM(NSUInteger, QC ...
- VSCode调试Html中的脚本 vscode前端常用插件推荐,搭建JQuery、Vue等开发环境 vsCode 添加浏览器调试和js调试的方法总结 VS Code - Debugger for Chrome调试js
一.背景 使用Visual Studio Code写了一个简单的Html页面,想调试下其中script标签里的javascript代码,网上查了一通,基本都是复制粘贴或者大同小异的文章,就是要安装De ...
- python添加tab键自动补全功能
默认python是没有tab键补全功能的: >>> import tab Traceback (most recent call last): File "<stdi ...
- 【转】一个对 Dijkstra 的采访视频
一个对 Dijkstra 的采访视频 (也可以访问 YouTube 或者从源地址下载 MPEG1,300M) 之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正 ...
- unity 获得父子节点
与常识不同,unity中获得父子节点需要通过transform.即先获得父/子节点的transform,然后再通过父/子节点的transform获得父/子节点. 获得父节点gameObject: Ga ...
- quartusii 使用ModelSim do文件实现仿真(Verilog)
QuartusII从9.1之后的版本都已经取消了内部自带的仿真器,都需要借助第三方仿真软件比如Modelsim才能实现仿真.一般在进行代码编写的时候,如果结合功能仿真,可以很快的验证代码实现的逻辑是否 ...
- cocos2d-x 粒子动作 setTexture
CCSize s = CCDirector::sharedDirector()->getWinSize(); CCNode* explosion = CCParticleSun::create( ...
- Java多线程和并发基础
第一:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运 ...
- ny511 移动小球
移动小球 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你n个小球,从左到右编号依次为1,2,3,4,5,6.........n,并规定小球1的左边的球号为n,小 ...