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。

这个中间件的功能是:

  1. 如果PATH_INFO中有'please_return_404'字符串,则返回一个404响应,否则交给下一个中间件处理(最后一个中间件就是我们的Rack应用程序)
  2. 在最终的响应体后面加一行'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即可启动我们的程序。

此时:

  1. 访问 localhost:9000/hi/hello 会返回我们的页面,而且下面多了一行字,'Hi, I am middleware'.
  2. 访问 localhost:9000/hello/please_return_404 则会返回404错误页面。

关于RACK的一点简单介绍的更多相关文章

  1. hotspot的简单介绍

    慢慢开始深入了解java,才知道java虚拟机有很多种,其中最为知名的应该就是hotspot了,接下来是hotspot的一点简单介绍. 没错,Java是解释语言,但并不意味着它一定被解释执行.早期 的 ...

  2. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  3. phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识

    16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结  一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...

  4. SharePoint 2010 网站备份还原简单介绍

    今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...

  5. CocoaPods常用终端命令及Profile文件简单介绍

    Pod常用终端命令 pod init 创建pod文件 pod install 开始安装第三方框架,如果网上有更新,会安装最新的 pod install --verbose--no-repo-updat ...

  6. photoshop工具使用的简单介绍

    photoshop工具使用的简单介绍 我所用PhotoShop版本号是cs6,这里对其主要功能做一个简单介绍. 第一部分: 首先,ps的界面主要分为了6部分: 一.最上面的一行的菜单栏,菜单中有:文件 ...

  7. Linux curl使用简单介绍

    在两台新搬迁的微信服务器上执行命令: curl -H "Content-Type: application/json" -d '{"partner_no":&q ...

  8. unity Dotween插件的简单介绍及示例代码

    unity里面做插值动画的插件有许多,比较常见的有itween.hotween.dotween.根据大家的反馈和实际体验来说,dotween插件在灵活性.稳定性.易用性上都十分突出.这里简单介绍下它的 ...

  9. 图像切割之(五)活动轮廓模型之Snake模型简单介绍

    图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...

随机推荐

  1. Apache服务器的URL重定向

    前端时间要整个Apache重定向功能,在此记录一下. 一.安装Apache Windows版本官方下载安装文件httpd-2.2.21-win32-x86-openssl-0.9.8r,选择安装目录, ...

  2. android assets文件夹资源的访问

    1.assets文件夹里面的文件都是保持原始的文件格式 . 2.assets中的文件只可以读取而不能进行写的操作. 3.assets目录下的资源文件不会在R.java自动生成ID,所以读取assets ...

  3. 关于android4.3 Intel X86 Atom System Image的下载

    今天建立android4.3模拟器的时候发现没有android4.3 Intel X86 Atom System Image可选,打开android SDK Manager 于是希望重现选择下载安装, ...

  4. App开发流程之图像处理工具类

    先罗列一下工具类中提供的方法: /** * 根据原始view和毛玻璃样式,获取模糊视图,并自动作为原view的subview(如果不需要作为子视图,自行调用removeFromSuperview) * ...

  5. Swift控制流

    本文简单的介绍swift一些基本语法的使用,在本文中不会做更深的剖析,只提及一些语法的简单的使用,快速学会编写swift程序.高手请绕路走嘿嘿 常量与变量: swift中定义所有的变量使用var,定义 ...

  6. 转 android launch flow

    Android系统开机主要经历三个阶段: bootloader启动 Linux启动 Android启动 启动文件: 对于机器从通电到加载Linux系统一般需要三个文件:bootloader(引导文件) ...

  7. C++中派生类对象的内存布局

    主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Objec ...

  8. mysql高可用之DRBD + HEARTBEAT + MYSQL

    1. 架构 Mysql: master<=slave 10.24.6.4:3306<=10.24.6.6:3306 VIP: 10.24.6.20 必须使得VIP和mysql处于同一网段, ...

  9. openstack中虚拟机和其网络的联系方法 instance and network

    instance和network的连接关系: 在neutron数据库中,ports存储了instance和端口的关系,其中device_id表示了instance的id,在nova数据库中的insta ...

  10. 【MySQL】MySQL忘记root密码解决方案

    转眼间从实习到现在已经快两年了.两年的工作做遇到过很多很多的拦路虎,大部分也通过搜索引擎找到了解决的方案.奈何大脑不是硬盘,偶尔有的问题第二次遇到还是有点抓蒙...所以决定把这些东西记录在博客上.这样 ...