博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Martini 中的 Handler
阅读量:6405 次
发布时间:2019-06-23

本文共 2189 字,大约阅读时间需要 7 分钟。

  hot3.png

前文参见

Handler

在Martini中是这样定义的

// Handler can be any callable function. Martini attempts to inject services into the handler's argument list.// Martini will panic if an argument could not be fullfilled via dependency injection.type Handler interface{}

事实上 Handler 就是一个函数. Handler 贯穿于多个对象中.

Martini

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 发生终止遍历.

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 内置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 有明确的终止队列条件.

Martini 社区组件

开发者建立了 组织. 这样的管理方式更开放. 事实上这样符合 Martini Injector 的风格, 组件之间的依赖可以通过 Injector 的 Map/Invoke 机制完成.

转载于:https://my.oschina.net/achun/blog/197546

你可能感兴趣的文章
OpenStack身世揭秘
查看>>
安装Centos7及注意事项
查看>>
flex中多个属性绑定一个目标属性的例子代码
查看>>
ubuntu修改用户名
查看>>
mysql主从不一致解决方法
查看>>
PAIP.pdf使用
查看>>
09.19 第二天
查看>>
USB端口管控应用解决方案
查看>>
使用网络发传真对现×××公的帮助
查看>>
1025 PAT Ranking
查看>>
搜索引擎优化SEO一般有哪些步骤或环节?
查看>>
指针,数组总结
查看>>
python学习笔记(四)
查看>>
我的友情链接
查看>>
zabbix监控环境的搭建(server端)
查看>>
计算机基础-计算机硬件
查看>>
实战:Windows 2008 WDS使用参考计算机创建安装映像
查看>>
删除组织单元
查看>>
B站运维团队成长的血泪史
查看>>
父亲节
查看>>