ruby-on-rails - 在 rails 3 中处理 HEAD 和 GET 请求时出现问题

标签 ruby-on-rails ruby ruby-on-rails-3

目前我们在处理 HEAD 和 GET 请求时遇到问题。让我解释一下详细的场景

我们在我们的应用程序中集成了入站和出站 SMS 功能。

但是在过去的 2-3 个月里,我们收到了来自 SMS 服务提供商的 2-3 次 GET 请求,这对我们的系统造成了影响。

在与 SMS 服务提供商长时间讨论后,他们说“Head 和 Get 请求在您端的处理方式相似”

我还提到了 this link .您可以在 this link 找到相应的日志

所以任何人都可以建议如何解决这个问题。

编辑 经过研究,我们发现我们正在获取 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

所以本质上,中间件甚至在路由器收到请求之前就更改了请求方法。 如果您希望您的路由器处理 HEAD 和 GET 请求之间的差异,您可以通过添加删除中间件

config.middleware.delete "ActionDispatch::Head"

到你的application.rb

否则,您应该能够像这样在 Controller 中访问该变量:

if request.env["rack.methodoverride.original_method"]=='HEAD'
  #do head processing here
  head :ok, :additional_header => 'value'
else
  #do get processing here
end

如果您担心性能,我建议您编写自己的中间件来处理这些请求。 Railscasts 有一些 good关于 this 的教程.

另请注意,其他中间件,如 Rack::Cache 也可能会干扰此过程。所以你应该在顶部插入你的中间件:

config.middleware.insert_before 0, "YourMiddleware"

关于ruby-on-rails - 在 rails 3 中处理 HEAD 和 GET 请求时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395890/

相关文章:

ruby-on-rails - 如何保护客户端应用程序( react )和 API 通信

ruby-on-rails - PG 类查询不起作用

ruby-on-rails - Rails 控制台不会自动加载第二个数据库的模型

ruby-on-rails - 如何将样式添加到 form_for 中的单个输入

javascript - Rails - 如何向使用 javascript 创建的表单添加 CSRF 保护?

ruby - 使用 devise 和 devise_ldap_authenticatable 在运行时检查组

ruby-on-rails - 如何使用Shoulda Matchers测试多态关联?

ruby - 如何在 irb 上使用特定的 gem 版本?

Ruby:类中的嵌套类与模块中的嵌套类相同吗?

ruby-on-rails - form_for 错误消息的写入条件