文档章节

martini备忘录

ricktian1226
 ricktian1226
发布于 2014/06/21 16:12
字数 621
阅读 58
收藏 0
点赞 0
评论 0

martini框架有两大核心功能:

1、注册处理函数功能

注册方法有三个:

Martini 对象设置Handler的方法:

  • Use 一次设置一个 handler

  • Handlers 一次设置全部 handler, 除了最后一个 Invoke 的 handler

  • Action 设置的最后一个被 Invoke的 Handler(内部成员单独命名为 action ). 通常是 Router.Handle.

Martini.ServeHTTP 方法主要执行了 m.createContext(res, req).run()

Context

Martini 对象在收到 http.Request 的时候动态创建 context, 并把所有的 handlers copy 一份给 context.

所有的 handlers 在 context.run 方法中被遍历 Invoke. 当遇到 error 或者有 Written 发生终止遍历.


2、路由功能

按照注册的请求类型已经请求url内容的匹配,调用对应的处理函数

Router

Router 有自己独立的 handlers.

每一个RESTful 方法都会构建一个 Route, 通过 RESTful 方法设置 Route handlers.

NotFound 设置 notFounds handlers.

Router.Handle 在 context.run 中被最后 Invoke.

Router.Handle 遍历匹配所有的 routes, 如果匹配到一个route, 通过 context.Invoke(route.Handle) 进行调用.

如果没有匹配到 route, 动态构建 routeContext 并把 notFounds 作为其 handlers 进行 routeContext.run.

Route

route.Handle 方法动态构建 routeContext 并把 route.handlers 作为其 handlers 进行 routeContext.run.

routeContext

routeContext.run 方法遍历并 Ivoke 所有的 routeContext.handlers, 当遇到 error 或者有 Written 发生终止遍历.

ResponseWriter.beforeFuncs

ResponseWriter 是在 Martini.createContext 的时候被动态 MapTo Context了.

ResponseWriter.Before 可以添加 beforeFuncs, beforeFuncs 会在任何 Write 操作前以倒序遍历调用一次.

当然 Before 在某个handler中才能被调用到.

Context.Next

前文参见 Martini 的工作方式 中曾经简单提到, Martini 内置Handler Logger和Recovery 是如何配合 Context.Next 进行工作的. 虽然Logger和Recovery的具体功能很简单.

这非常实用. 在使用 Handler 的时候切勿忘记.

使用

通过上述分析可知

  • 所有的 Martini.handlers 都会被调用, 发生 error 或 Written 终止.

  • 所有匹配到的 Route.handlers 都会被调用, 发生 error 或 Written 终止.

  • 所有 ResponseWriter.beforeFuncs 在 Write 时会先被倒序调用一次.

  • Martini 的 Action 方法提供了机会允许使用者自己控制 Router.Handle.

  • 在 Handler 中与 context.Next() 的配合.

可以用通过下列途径使用 Handler

  • Martini.Use 或者 Martini.Handlers 设置 handlers.

  • Router 的 RESTful(pattern string, h …Handler) 方法 设置 handlers.

  • Router.NotFound 设置 notFounds.

  • 在 Handler 中设置 beforeFuncs.

这些 Handlers, notFounds, beforeFuncs 形成了调用队列, Handlers 和 notFounds 有明确的终止队列条件.


参考 http://my.oschina.net/achun/blog/197546



本文转载自:

共有 人打赏支持
ricktian1226
粉丝 0
博文 6
码字总数 2728
作品 0
厦门
Martini源码剖析

martini是非常优雅的Go Web框架。他基于依赖注入的思想,仿照Sinatra的路由设计,参考Express的中间件设计,而且核心微小,扩展方便,非常值得学习。但是由于本身API设计简洁,使很多细节无法...

傅小黑 ⋅ 2014/04/24 ⋅ 7

cordova-hcp server 报错

Running serverCould not create tunnel: Error: panic: runtime error: invalid memory address or nil pointer dereference github.com/inconshreveable/olive/recover.go:40runtime/asm_a......

mamie42 ⋅ 2016/10/17 ⋅ 0

Martini 中的 Handler

前文参见 Martini 的工作方式 Handler 在Martini中是这样定义的 事实上 Handler 就是一个函数. Handler 贯穿于多个对象中. Martini Martini 对象设置Handler的方 Use 一次设置一个 handler ...

喻恒春 ⋅ 2014/02/07 ⋅ 1

Martini 极好的 Go WEB 框架

已知的其他框架看到的是传统OOP的影子, 到处充蚀 Class 风格的 OOP 方法. 而我们知道GoLang中是没有Class的. 笔者也曾努力用Go 的风格做WEB开发, 总感到力不从心. 写出的代码不能完全称之为框...

喻恒春 ⋅ 2014/01/07 ⋅ 16

Martini 的工作方式

后续参见Martini 中的 Handler 匿名字段 因为golang中没有继承, golang中用的方法是匿名字段, 很多golang开发者称之为复合, 可是我没有发现官方文档中对此进行正规命名, 用继承这个词肯定不合...

喻恒春 ⋅ 2014/01/14 ⋅ 14

Martini 组件和实用工具--martini-contrib

martini-contrib 是一个贡献 Martini 的处理程序和实用工具,这个包包括了各种添加到 Martini 上面的组件和一个高级的GO web 框架。

叶秀兰 ⋅ 2014/01/14 ⋅ 0

go-martini基础入门

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

别人说我名字很长 ⋅ 2015/10/31 ⋅ 0

Go语言的Web框架

我去年开始研究Go语言,不知不觉快有一年了。以前我研究php和nodejs,都是弱类型的解释性语言。想找一个编译型的强类型语言继续学习,就选中了新奇的Go语言。我只关注Web方面的应用,看了很多...

傅小黑 ⋅ 2014/03/13 ⋅ 6

Python/Ruby/Go/Node 之四国大战

Python Flask vs Ruby Sinatra vs Go Martini vs Node Express 本文授权转载自 zybuluo 博客。 题外话一:最近一段时间,Cloud Insight 接连发布了三种语言(Python, Node, Ruby)的SDK,Clo...

OneAPM蓝海讯通 ⋅ 2016/03/17 ⋅ 0

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件

首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务: 原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977 packa...

ponpon_ ⋅ 2014/05/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 30分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 56分钟前 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

[知乎]SSH框架

网上图书馆管理系统包括管理员管理和图书管理,图书借阅,查询模块等等,网上商城包括前台页面和后台管理页面,两个都是以前别人的实际项目,只是别人用的不是SSH,我把他们改用SSH了,除了S...

颖伙虫 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部