【问题标题】:Cache problem running two consecutive HTTP GET requests from an APP1 to an APP2从 APP1 到 APP2 运行两个连续 HTTP GET 请求的缓存问题
【发布时间】:2011-06-05 22:06:38
【问题描述】:

我使用 Ruby on Rails 3,我有 2 个应用程序(APP1 和 APP2)在两个子域上工作:

  • app1.domain.local
  • app2.domain.local

我正在尝试从 APP1 到 APP2 运行两个连续的 HTTP GET 请求,如下所示:

APP1 中的代码(请求):

before_filter :run_request

def run_request
    response1 = Net::HTTP.get( URI.parse("http://app2.domain.local?test=first&id=1") )
    response2 = Net::HTTP.get( URI.parse("http://app2.domain.local/test=second&id=1") )
end

APP2中的代码(响应):

before_filter :run_response

def run_response
    respond_to do |format|
      if <model_name>.find(params[:id]).<field_name> == "first"
        <model_name>.find(params[:id]).update_attribute ( <field_name>, <field_value> ) 
        format.xml { render :xml => <model_name>.find(params[:id]).<field_name> }
      elsif <model_name>.find(params[:id]).<field_name> == "second"
        format.xml { render :xml => <model_name>.find(params[:id]).<field_name> }
      end
    end
end

在第一个请求之后,我得到了正确的 XML(response1 是我所期望的),但第二个不是(response2 不是我所期望的)。做一些测试,我发现&lt;model_name&gt;.find(params[:id]).&lt;field_name&gt; 第二次运行(对于 elsif 语句)它总是返回一个空白值,因此 elseif 语句中的代码永远不会运行。

问题是否可能与缓存&lt;model_name&gt;.find(params[:id]).&lt;field_name&gt;有关?


通知

如果我尝试这段代码

respond_to do |format|
  if <model_name>.find(params[:id]).<field_name> == "first"
    <model_name>.find(params[:id]).update_attribute ( <field_name>, <field_value> ) 
    format.xml { render :xml => <model_name>.find(params[:id]).<field_name> }
  else
    format.xml { render :xml => <model_name>.find(params[:id]) }
  end
end

response2 是整个 &lt;model_name&gt;.find(params[:id] 对象。请注意,我删除了“elsif”条件(为了运行第二个请求,以便我可以得到 response2)并且我更改了代码

format.xml { render :xml => <model_name>.find(params[:id]) }

format.xml { render :xml => <model_name>.find(params[:id]).<field_name> }

P.S.:我读到了 eTag and Conditional GET,但我不确定我是否必须使用这种方法。我想保持一切简单。

【问题讨论】:

  • 您能否为该操作添加完整代码并修复第二个网址中的拼写错误?
  • 代码“不在操作中”,但在 APP1(请求)和 APP2(响应)的“application_controller.rb”中。我有一个调用请求和响应的“before_filter”。
  • 再一次,您应该在 APP2 上显示您的日志...
  • 如何/在哪里可以在 APP2 上显示日志?

标签: ruby-on-rails http caching get request


【解决方案1】:

查询可能在应用程序控制器级别缓存。 Rails 在操作结束时销毁查询缓存,但您的查询不在操作中。

对于它的价值,APP2 中的代码很可能不应该在应用程序控制器中,而是在控制器中的操作中。这更加 RESTful,并且可能还会处理缓存问题(因为 Rails 将清除 APP1 请求之间的查询缓存)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多