2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Rack:处理 HTTP 请求更简单

  • 2008-04-15
  • 本文字数:1010 字

    阅读完需:约 3 分钟

Rack 提供了 Web 服务器和 Ruby 开发框架之间的接口。它将框架编写者从为每个 Web 服务器单独编写一个处理模块的繁重负担中解脱出来,可以节省大量重复劳动。

Rack 相当易用,如下示例便可以让你创建一个运行于 Mongrel 上的极简应用处理器:

<pre id="a7yh">require 'rack'<br id="twiq"></br>app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello World!']] }<br id="qsr7"></br>Rack::Handler::Mongrel.run(app, :Port => 3000)参数 env 包括一个环境变量和请求参数的散列。代码块的返回值由带有三个元素的数组组成:HTTP 状态码、响应头和响应体。

Rack 的创始人 Christian Neukirchen 为 InfoQ 分享了一些 Rack 的历史:

起初,我对 Ruby 的 Web 开发框架的状态感觉不太舒服,于是有了自己写的打算。正当这时, web.py 发布了,我很喜欢它那么精致而又易于维护。所以我开始编写自己的框架,但是没有成功,因为我写了很多计划外的东西,例如 Cookie 解析等等。实际上我从其他的项目中拷贝了一些代码过来,但是要做的工作依然令人厌烦。于是这个框架作废了。后来,我了解到了 Python 的 Nevow ,并试图去模仿它开发一些东西。但是就在我刚开始开发的时候,我发现我正在为不同的服务器重写辅助方法(helper)和适配器(adapter)。在深入的了解 Python 框架之时,我偶然发现了 WSGI ,我阅读它、喜欢它、简化它,并最终完成了 Rack 的原形。我重新组织了已写代码,并基于 Python Paste 的结构模块化,很快 Rack 0.1 就已经完成了。

当 Rack 可用之时,我依然没有喜欢的框架,所以我开发了 Coset ,这也是我最近一直在用的框架。它的设计灵感来自于 Camping web.py RESTlet

已经有相当多的框架提供了对 Rack 的支持

* Camping (包含在 Rack 发行版中)
\* Coset
\* Halcyon
\* Maveric
\* Merb
\* Mack
\* Racktools::SimpleApplication
\* Ramaze
\* Rails (第三方,与 thin 协同交付)
\* Sinatra
\* Vintage

Rack 可以和框架协同使用。例如,如果想简便而快速的处理一个确定的请求,Rack 的 Rack::Cascade 可以将几个应用级联起来。这篇 Ezra Zygmuntowicz 的博客讲解了如何通过 Rack 实现文件上传,而不需要访问整个 merb 栈。

接下来,Christian 计划稳定其规范,为 1.0 发布版做准备。

要了解更多 Rack 的信息,请访问 Rack 的官方网站。希望了解更深入的信息的话,这里还有一篇关于 Rack 的内部工作机制的 Euruko 07 论文

查看英文原文: Rack: HTTP request handling made easy

2008-04-15 21:511565
用户头像

发布了 80 篇内容, 共 23.2 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

「经验总结」高效开发,老代码可以这样动

叶一一

高效工作 前端 10月月更

「CSS畅想」自动打字效果,默写首诗来读读

叶一一

JavaScript 前端 10月月更

「CSS畅想」定时+随机,开启今日上上签

叶一一

JavaScript 前端 10月月更

「前端组件化」以Antd为例,快速打通UI组件开发的任督二脉

叶一一

前端 React 10月月更

List的基础数据的处理

卢卡多多

List 10月月更

「前端组件开发」越折腾越有趣,封装了一个表单组件

叶一一

前端 React 组件开发 10月月更

「小程序开发」关于网页与小程序的通信

叶一一

前端 小程序开发 10月月更

面向对象之方法重载

魏铁锤

10月月更

微信红包体系设计分析

Johnny

微信红包系统设计分享 | 如何扛住100亿次请求?

Johnny

Java面向对象之方法块+this关键字

魏铁锤

10月月更

「Hive进阶篇」三、HQL底层执行过程及原理详解

大数据阶梯之路

大数据 hive 面试 数仓

如何“阅读”数学?:上海顶尖中学学生的阅读笔记

图灵教育

数学 青少年

一文彻底搞懂IP地址到底是什么?

長歌

微信红包后台系统可用性设计实践

Johnny

cstdio的源码学习分析10-格式化输入输出函数fprintf---宏定义/辅助函数分析02

桑榆

源码刨析 10月月更 C++

【愚公系列】2022年10月 Go教学课程 028-函数小结案例(通讯录)

愚公搬代码

10月月更

将系统划分为模块(微服务)的必要性

宇宙之一粟

微服务 系统设计 论文阅读 模块化 10月月更

「React开发」梳理HOC的点点滴滴

叶一一

前端 React 10月月更

从手动测试到自动化测试(下)

FunTester

【从0到1学算法】4.Bubble Sort算法-上

Geek_65222d

10月月更

如何“阅读”数学?:上海顶尖中学学生的阅读笔记

图灵社区

数学 青少年

微信红包实现原理

Johnny

全链路监控建设的4个重点

穿过生命散发芬芳

全链路监控 10月月更

「Hive进阶篇」四、HQL 高级巧用

大数据阶梯之路

大数据 hive 面试

当 WASM 遇见 eBPF:使用 WebAssembly 编写、分发、加载运行 eBPF 程序 | 龙蜥技术

OpenAnolis小助手

开源 操作系统 内核 ebpf Wasm

容量管理的三个层次

阿泽🧸

10月月更 容量管理

Java面向对象之构造方法

魏铁锤

10月月更

leetcode 146. LRU Cache LRU 缓存 (简单)

okokabcd

LeetCode 数据结构与算法

层出不穷的机器学习框架到底在“卷”什么?

小红书技术REDtech

机器学习

「CSS畅想」我的发呆专属,反复解锁手机屏幕

叶一一

CSS JavaScript 前端 10月月更

Rack:处理HTTP请求更简单_Ruby_Mirko Stocker_InfoQ精选文章