2014-05-14 28 views
0

我需要在服务器获取请求时获取uuid或时间请求。在Rails中很容易,但我正在开发一个gem,我希望它更通用。所以我希望它能和Sinatra以及其他在http服务器上运行的其他Ruby应用程序一起工作。HTTP请求uuid或Ruby应用程序中的请求开始时间

这是另一个问题,它是一个宝石。我不能将Time.now置于我的应用程序控制器的起始位置。我需要它是通用的,所以它应该适用于不同的框架。

你会提出什么建议?

回答

1

您可以实现一个Rack中间件,您可以独立于您的实际应用框架(只要它使用机架,至少Rails,Sinatra,Padriono和大多数其他Ruby Web框架都适用)。

Rails已经包含一个中间件,用于向ActionDispatch::RequestId中所需的请求中添加唯一ID。另一种选择可能是rack-request-id gem

这个中间件的最小版本看起来是这样的:

class RequestIdMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    env['request_id'] = env['HTTP_X_REQUEST_ID'] || SecureRandom.uuid 
    env['request_started_at] = Time.now 

    @app.call(env) 
    end 
end 

然后,您可以在您的config.ru使用中间件或通过在Rails中添加以下内容到application.rb

config.middleware.use RequestIdMiddleware 
+0

但我做不到在没有入侵Rails/Sinatra应用的宝石中使用它?不是每个用户都有'config.ru',并且在Rails中我应该使用'config.middleware.use',在Sinatra'use'中,那么其他框架呢?有没有通用的解决方案? – ciembor

+0

每个使用机架的框架(正如我所说的,它是关于任何红宝石web框架的)可以使用额外的机架中间件。事实上,机架的大部分默认功能都由机架中的多个中间件类提供。因此,机架中间件**是通用解决方案。如何在实际框架中设置中间件是不同的,但所有框架最终都可以使用它。 –