·
Ruby (Rails) 中间件原理与流程简介
Ruby 中间件(Middleware)基于 Rack 规范,是 Rails 处理 HTTP 请求的“链式管道”。每个中间件是一个类,实现了 call(env) 方法。
原理
Ruby 中间件(Middleware)基于 Rack 规范,是 Rails 处理 HTTP 请求的“链式管道”。每个中间件是一个类,实现了 call(env) 方法:
-
输入:
env(Rack 环境哈希,包括 URL、headers、params)。 -
输出:
[status, headers, body](HTTP 状态、头、响应体)。 - 核心思想:像洋葱层,中间件可修改请求/响应(如日志、认证、静态文件),不耦合核心应用。
-
Rails 集成:
config.middleware栈管理顺序,先添加的先执行(外层)。
执行流程
-
请求进入:浏览器发送请求 → Rack 入口 → 外层中间件
call(env)。 -
链式调用:每个中间件调用下一个(
@app.call(env)),向内执行(外到内)。 - 核心处理:到达 Rails 应用 → 控制器执行 → 返回响应。
- 响应返回:逆序执行(内到外),中间件可修改响应(如添加头)。
- 结束:返回客户端。
流程图(简化):
请求 → 中间件1.call → 中间件2.call → ... → Rails App → ... ← 中间件2.call ← 中间件1.call → 响应
示例
# app/middleware/my_middleware.rb
class MyMiddleware
def initialize(app)
@app = app # 下一个中间件
end
def call(env)
# 请求前处理
Rails.logger.info "Request: #{env['REQUEST_URI']}"
status, headers, body = @app.call(env) # 调用下一个
# 响应后处理
headers['X-Custom'] = 'Value'
[status, headers, body]
end
end
# config/application.rb
config.middleware.use MyMiddleware # 添加到栈
优点:模块化、可复用;缺点:调试复杂(用 config.middleware.insert_before/after 控制顺序)。
参考:Rails Guides - Rack Middleware。
轉發此貼文?
與您的關注者分享。
回覆