I-a*_*ser 5 ruby ruby-on-rails ruby-on-rails-3
目前,我们正面临处理HEAD和GET请求的问题.让我解释详细的情况
我们在我们的应用程序中集成了入站和出站SMS设施.
但是从过去的2-3个月开始,我们收到来自SMS服务提供商的2-3次GET请求,这对我们的系统产生了影响.
经过与SMS服务提供商的长时间讨论,他们说"从头到尾"处理"头部和获取请求"
那么任何人都可以建议如何解决这个问题.
编辑 经过研究,我们发现我们正在获取HEAD和GET请求中的所有参数,因为该服务器正在处理它.
我认为问题可能出在ActionDispatch::Head中间件上。其中一部分是以下代码:
def call(env)
if env["REQUEST_METHOD"] == "HEAD"
env["REQUEST_METHOD"] = "GET"
env["rack.methodoverride.original_method"] = "HEAD"
status, headers, _ = @app.call(env)
[status, headers, []]
else
@app.call(env)
end
end
Run Code Online (Sandbox Code Playgroud)
因此,本质上,中间件在路由器收到请求之前就改变了请求方法。如果您希望路由器处理 HEAD 和 GET 请求之间的差异,您可以通过添加来删除中间件
config.middleware.delete "ActionDispatch::Head"
Run Code Online (Sandbox Code Playgroud)
到您的应用程序.rb
否则,您应该能够在控制器中访问该变量,如下所示:
if request.env["rack.methodoverride.original_method"]=='HEAD'
#do head processing here
head :ok, :additional_header => 'value'
else
#do get processing here
end
Run Code Online (Sandbox Code Playgroud)
如果您担心性能,我建议您编写自己的中间件来处理这些请求。Railscasts 有一些关于这方面的很好的教程。
另请注意,其他中间件(例如 Rack::Cache)也可能会干扰此过程。所以你应该在上面插入你的中间件:
config.middleware.insert_before 0, "YourMiddleware"
Run Code Online (Sandbox Code Playgroud)