关于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项目实战(九):CustomShapeImageView 自定义形状的ImageView
一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/Custo ...
- iOS循环引用问题
今天面试问道了循环引用,所以就看了看,原来只是知道使用了Block容易造成循环引用.今天就来简单的介绍一些循环引用. 先来简单介绍一下什么是循环引用? 循环引用可以简单的理解成:A对象引用了B对象,B ...
- Struts2(十一)OGNL标签三与Struts2标签
一.UI标签 二.简单例子 <h1>添加信息</h1> <!--通过指定theme的属性改变主题 --> <s:form action="" ...
- unity下载文件三(http异步下载)
异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂. 直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控. 1.首先请求下载. ...
- iOS网络检测Reachability 使用 Demo,可检测2、3、4G
你可以在Github下载这个Demo https://github.com/JanzTam/Reachability_Demo 首先,引入系统的Reachability类,不知道怎么引入的话,在Xco ...
- MJExtension简介
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The specified file could not be encrypted.
背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The ...
- PS网页设计教程XXVI——如何在PS中创建一个专业的网页布局
作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...
- nginx 负载均衡示例
一.nginx nginx是一个轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,以开源形式发布.nginx的性能稳定,功能丰富,配置简单,且占用系统资源低.可支持多个 ...
- 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ...