什么是rack

rack是对ruby的Net::HTTP进行封装了的包,使用rack能够方便的新建一个简单的web应用。

what is rack

Rack describes itself as follows:

Rack在支持Ruby和Ruby框架的web服务间提供了一个最小接口。

Rack出现以前,Ruby的web框架都是实现自己的一套接口,导致实现web服务非常的困难,同时不同框架之间也很难共享代码。现在几乎所有的Ruby web框架都实现了Rack,包括Rails和Sinatra,也就是说,现在这些应用都以类似的方式运行。

Rack核心框架提供了大量的工具让你能够很简单的构建自己的web应用或接口。一行代码就可以实现一个Rack应用,但是我们需要更屌一点。


rack安装

Rack的安装很简单:

gem install rack

helloword举例

#config.ru文件内容
class Helloworld
def call(env)
[200, {'Content-Type' => 'text/html'}, ["Hello World!"]]
end
end
run Helloworld.new

上面的代码和下面的lambda表达式功能是等价的:

run ->(env) { [200, {"Content-Type" => "text/html"}, ["Hello World!"]] }

当前路径下执行rackup

#rackup
[2016-09-24 10:34:45] INFO WEBrick 1.3.1
[2016-09-24 10:34:45] INFO ruby 1.9.3 (2014-11-13) [x86_64-linux]
[2016-09-24 10:34:45] INFO WEBrick::HTTPServer#start: pid=125538 port=9292

浏览器访问http://localhost:9292 或执行curl 127.0.0.1:9292就能看到内容

# curl  127.0.0.1:9292
hello world

Rack是怎么工作的

Rack有两个简单的要求。第一,你的请求必须有一个call方法响应,这就是为什么lambda或者Proc在这里可以用。call方法需要一个类似hash的参数,参数中包含了请求以及其他的环境参数。call方法返回包含三个元素的数组,[status, header, body]。status是对request的响应状态;header是一个哈希,内容是响应的头部信息;body是响应的消息体,必须是一个可遍历的对象,例如Array或者IO对象。

使用Rack提供的工具

Rack提供了大量的工具用于构建Ruby应用,所以我们尝试使用一个小工具,我们来增加些路由。

class HelloWorld
def call(env)
req = Rack::Request.new(env)
case req.path_info
when /hello/
[200, {"Content-Type" => "text/html"}, ["Hello World!"]]
when /goodbye/
[500, {"Content-Type" => "text/html"}, ["Goodbye Cruel World!"]]
else
[404, {"Content-Type" => "text/html"}, ["I'm Lost!"]]
end
end
end run HelloWorld.new

执行结果:

# curl  127.0.0.1:9292/hello
Hello World!
#
# curl 127.0.0.1:9292/goodbye
Goodbye Cruel World!

首先我们创建了一个Rack::Request对象,并将request中传递过来的env对象提供给Rack::Request对象。然后我们就可以使用path_info属性,根据其值进行我们的路由处理。

如果此时用浏览器访问http://localhost:9292,就会得到一个404错误页面。

让我们更屌一点

虽然上面的方法已经能够提供简单的路由功能,但是太挫,而且case也没法实现我们所有的路由功能。

我们更进一步,构建一个能够处理GET请求的小框架。

我们先来看看应用长什么样子,然后再一点点实现我们的框架。

#当前目录添加到ruby的加载路径中
$:.unshift File.dirname(__FILE__)
#require我们后面要实现的框架
require 'simple_framework0' route("/hello") do
"Hello #{params['name'] || "World"}!"
end route("/goodbye") do
status 500
"Goodbye Cruel World!"
end run SimpleFramework.app

simple_framework0.rb将是我们的框架实现代码,提供了一个route方法,route方法需要一个路径和块作为参数。如果请求能够和path匹配,提供的块将会被执行,块的最后一行代码是返回值,将作为response的body。


看看我们的SimpleFramework长啥样。

# 后面将要实现的action,处理具体的请求
require 'action'
class SimpleFramework def self.app
@app ||= begin
Rack::Builder.new do
map "/" do
run ->(env) {[404, {'Content-Type' => 'text/plain'}, ['Page Not Found!']] }
end
end
end
end end def route(pattern, &block)
SimpleFramework.app.map(pattern) do
run Action.new(&block)
end
end

下面是Action的实现。

class Action
attr_reader :headers, :body, :request def initialize(&block)
@block = block
@status = 200
@headers = {"Content-Type" => "text/html"}
@body = ""
end def status(value = nil)
value ? @status = value : @status
end def params
request.params
end def call(env)
@request = Rack::Request.new(env)
@body = self.instance_eval(&@block)
[status, headers, [body]]
end end

整个的代码结构是:

tree
.
├── action.rb
├── config.ru
└── simple_framework0.rb

参考文档

gist:4240848

rack简介的更多相关文章

  1. ElasticSearch学习笔记-01 简介、安装、配置与核心概念

    一.简介 ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进 ...

  2. 【原创】大数据基础之Marathon(1)简介、安装、使用

    marathon 1.6.322 官方:https://mesosphere.github.io/marathon/ 一 简介 Marathon is a production-grade conta ...

  3. ELK系列三:Elasticsearch的简单使用和配置文件简介

    1.定义模板创建索引: 首先定义好一个模板的例子 { "order":14, "template":"ids-1", "state ...

  4. 1 预备知识--Hadoop简介

    1 预备知识--Hadoop简介 Hadoop是Apache的一个开源的分布式计算平台,以HDFS分布式文件系统和MapReduce分布式计算框架为核心,为用户提供了一套底层透明的分布式基础设施Had ...

  5. TCP系列23—重传—13、RACK重传

    一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...

  6. java大数据最全课程学习笔记(3)--HDFS 简介及操作

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 HDFS 简介及操作 HDFS概述 HDFS产出背景及定义 HDFS优缺点 HDFS组成架构 HDFS文件块大小 ...

  7. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  8. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  9. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

随机推荐

  1. Linux服务器部署系列之二—MySQL篇

    MySQL是linux环境中使用最广泛的数据库之一,著名的“LAMP黄金组合”就要用到MySQL.关于MySQL的优点及作用,我就不多讲了,网上很多这样的文章. 今天我们要谈的是MySQL服务器的部署 ...

  2. 一文读懂:超详细正态分布方差等于o的推导

    (uv)' = [(u+△u)(v+△v) - uv] /△x = (v△u+u△v +△u△v)/△x = v(△u/△x) + u(△v/△x) +(△u△v)/△x =u'v+uv'

  3. HDU 3897 Base Station (网络流,最大闭合子图)

    题意:给定n个带权点m条无向带权边,选一个子图,则这个子图的权值为 边权和-点权和,求一个最大的权值. 析:把每条边都看成是一个新点,然后建图,就是一个裸的最大闭合子图. 代码如下: #pragma ...

  4. UVa 11292 Dragon of Loowater (水题,排序)

    题意:有n个条龙,在雇佣勇士去杀,每个勇士能力值为x,只能杀死头的直径y小于或等于自己能力值的龙,只能被雇佣一次,并且你要给x赏金,求最少的赏金. 析:很简单么,很明显,能力值高的杀直径大的,低的杀直 ...

  5. C++标准模板库(STL)和容器

    1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...

  6. 13) Developing Java Plugins

    官方指导 http://maven.apache.org/guides/plugin/guide-java-plugin-development.html http://maven.apache.or ...

  7. java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)

    static是静态修饰符: 什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个 ...

  8. 集合(五)不正确地使用HashMap引发死循环及元素丢失

    前一篇文章讲解了HashMap的实现原理,讲到了HashMap不是线程安全的.那么HashMap在多线程环境下又会有什么问题呢? 几个月前,公司项目的一个模块在线上运行的时候出现了死循环,死循环的代码 ...

  9. Android-JVM中的多线程&垃圾回收

    Java语言是为数不多支持多线程技术的编程语言,而这多线程就不得不提到JVM虚拟机 先看代码案例:(JVM收垃圾) package android.java.thread; class Demo { ...

  10. C#不用union,而是有更好的方式实现

    用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C#为什么没有这个关键字呢?怎么实现这个功能?其实 ...