关于RACK的一点简单介绍
0 前言
如有错误欢迎指出,如需转载,请注明原文链接。
1 Rack是什么
一句话介绍,Rack是一个Web接口,定义了一系列的标准,具体实现的工作是交给服务器(puma, thin等)做的。
如果你了解J2EE,Rails开发和J2EE开发对比,大概是这么个关系
- Rack - Servlet
- puma, thin等 - tomcat, weblogic等
- Rails - J2EE中常用的开发框架,如spring-mvc, structs2, mybatis等
2 Rack程序长什么样子
Rack的标准非常简单:
一个Rack程序是一个对象,这个对象要求能响应
call方法,并且接受一个Hash参数,并返回一个数组,这个数组里面分别是:
- HTTP响应码 [Integer]
- HTTP响应头 [Hash]
- HTTP响应体 [需要能响应
each方法]
一个简单的Rack程序,我们把它保存为rack_app.rb
require 'rack'
app = Proc.new do |env|
[
200,
{ 'Content-Type' => 'text/html; charset=utf-8' },
[
'<h1>一个简单的Rack程序</h1>',
'<p>其它内容...</p>'
]
]
end
详细标准请阅读Rack的说明文档。
3 运行Rack程序
我们将下面的代码保存到config.ru
require_relative 'rack_app'
Rack::Handler::WEBrick.run(app, Port: 9000)
这里,WEBrick是一个Rack自带的实现,我们可以用它来运行我们的Rack应用程序。另外,在运行之前,我们需要确保我们已经安装Rack的gem包。如果你不确定,可以运行gem install rack来安装。
现在,我们运行ruby config.ru,就可以看到下面的输出
[2016-11-02 19:06:46] INFO WEBrick 1.3.1
[2016-11-02 19:06:46] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux]
[2016-11-02 19:06:46] INFO WEBrick::HTTPServer#start: pid=28184 port=9000
在浏览器里面访问localhost:9000即可看到页面。
当然,你也可以用任何其它基于Rack的服务器来运行我们的程序。比如puma,首先运行gem install puma来安装puma的gem包,然后修改我们的config.ru:
require_relative 'rack_app'
require 'puma'
require 'rack/handler/puma'
Rack::Handler::Puma.run(app, Port: 9000)
运行ruby config.ru,就可以看到下面的输出
Puma starting in single mode...
* Version 3.6.0 (ruby 2.3.1-p112), codename: Sleepy Sunday Serenity
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:9000
Use Ctrl-C to stop
总之,Rack提供了一个统一的接口,基于Rack开发的任何应用(或者说是Web框架)都可以在实现了Rack接口的服务器上运行。
4 Rack中间件
参考原文:Understanding Rack Middleware
Rack服务器在运行应用之前,可以先经过若干个中间件。在请求到达我们的应用前,中间件预先对他们做一些处理。Rack中间件是一个类,它的构造方法接受一个能响应call方法的对象,它必须有一个call实例方法。
我们写一个简单的中间件,保存为my_middleware.rb。
这个中间件的功能是:
- 如果PATH_INFO中有'please_return_404'字符串,则返回一个404响应,否则交给下一个中间件处理(最后一个中间件就是我们的Rack应用程序)
- 在最终的响应体后面加一行'Hi, I am middleware.'
class MyMiddleware
# 实例化中间件的时,会把下一个中间件传进来
# 最后一个"中间件"就是我们的应用程序
def initialize(app)
@app = app
end
def call(env)
if env['PATH_INFO'].include?('please_return_404')
[ 404, { 'Content-Type' => 'text/plain' }, ['Error, 404!'] ]
else
response = @app.call(env)
response[2] << 'Hi, I am middleware.'
response
end
end
end
要使用这个中间件来运行我们的应用,修改我们的config.ru:
require_relative 'rack_app'
require_relative 'my_middleware'
app2 = Rack::Builder.app do
use MyMiddleware
# use AnotherMiddleware
# 你还可以使用更多的中间件
# ...
run app
end
Rack::Handler::WEBrick.run(app2, Port: 9000)
最后,我们运行ruby config.ru即可启动我们的程序。
此时:
- 访问 localhost:9000/hi/hello 会返回我们的页面,而且下面多了一行字,'Hi, I am middleware'.
- 访问 localhost:9000/hello/please_return_404 则会返回404错误页面。
关于RACK的一点简单介绍的更多相关文章
- hotspot的简单介绍
慢慢开始深入了解java,才知道java虚拟机有很多种,其中最为知名的应该就是hotspot了,接下来是hotspot的一点简单介绍. 没错,Java是解释语言,但并不意味着它一定被解释执行.早期 的 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识
16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...
- SharePoint 2010 网站备份还原简单介绍
今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...
- CocoaPods常用终端命令及Profile文件简单介绍
Pod常用终端命令 pod init 创建pod文件 pod install 开始安装第三方框架,如果网上有更新,会安装最新的 pod install --verbose--no-repo-updat ...
- photoshop工具使用的简单介绍
photoshop工具使用的简单介绍 我所用PhotoShop版本号是cs6,这里对其主要功能做一个简单介绍. 第一部分: 首先,ps的界面主要分为了6部分: 一.最上面的一行的菜单栏,菜单中有:文件 ...
- Linux curl使用简单介绍
在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...
- unity Dotween插件的简单介绍及示例代码
unity里面做插值动画的插件有许多,比较常见的有itween.hotween.dotween.根据大家的反馈和实际体验来说,dotween插件在灵活性.稳定性.易用性上都十分突出.这里简单介绍下它的 ...
- 图像切割之(五)活动轮廓模型之Snake模型简单介绍
图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...
随机推荐
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- 深入了解Activity-生命周期
一 介绍 Activity是android中使用最为频繁的组件,在官方文档中是这样描述的:An activity is a single, focused thing that the user ca ...
- 【原】iOS下KVO使用过程中的陷阱
KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.网上广为流传普及的一个例子是利用KVO检测股票价格的变动,例如这里.这个 ...
- Stack与Heap的区别
申明:这里所说的栈和堆是程序内存管理中的栈和堆,而不是数据结构里的栈和堆. (1)保存的内容不同:栈里保存的是局部变量,而堆里保存的是动态申请的变量. (2)栈里的内存系统自动申请和释放,程序执行出申 ...
- Handler、Looper、MessageQueue、Thread源码分析
关于这几个之间的关系以及源码分析的文章应该挺多的了,不过既然学习了,还是觉得整理下,印象更深刻点,嗯,如果有错误的地方欢迎反馈. 转载请注明出处:http://www.cnblogs.com/John ...
- ipad横竖屏尺寸(转载)
iPad在横屏模式下,界面区域元素主要由下图所示构成: 横屏主要尺寸:宽度:1024px高度:768px状态栏(Status Bar)高度:20px导航条(Nav Bar)高度:44px主内容区域(M ...
- LightSpeed的批量更新和批量删除
1.Update对于批量操作 无论是Update还是Remove 都是使用LightSpeed的Query对象来完成. 注:Student是要进行Update的表(实体),StuName是表Stud ...
- ASP.NET动态加载用户控件的方法
方法是使用LoadControl方法,根据用户控件的相对路径,动态生成用户控件对象 用户控件 public class UserControlA :UserControl { public UserC ...
- oracle REGEXP_SUBSTR函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...
- 使用POI实现数据导出Excel表格
package cn.sh.bzt.kwj.action; import java.io.IOException; import java.io.OutputStream; import java.t ...