【问题标题】:javascript response not parsed with status code 4xxjavascript 响应未使用状态码 4xx 解析
【发布时间】:2011-11-10 02:14:06
【问题描述】:

我在我的控制器中执行以下操作:

def publish
  respond_to |format|
    format.js do
      if allowed_to_publish then
        render :js => 'alert("successful");'
      else
        render :js => 'alert("error");'
      end
    end
  end
end

客户端通过 ajax 请求访问方法。到目前为止,这很好用,唯一让我烦恼的是,响应的状态代码始终是“200”。

当出现错误且无法完成请求时,根据错误类型应为 4xx 或 5xx 响应。就我而言,publish 可能会在用户未输入所有必需的详细信息时出错。我认为正确的状态码是412 precondition failed

现在,当我更改状态代码时,它不再执行 javascript:

def publish
  respond_to |format|
    format.js do
      if allowed_to_publish then
        render :js => 'alert("successful");'
      else
        render :js => 'alert("error");', :status => 412
      end
    end
  end
end

客户端得到相同的响应,但状态码,不再执行 javascript。响应头如下:

Date    Sun, 04 Sep 2011 12:29:58 GMT
Server  Apache/2.2.14 (Ubuntu)
X-Powered-By    Phusion Passenger (mod_rails/mod_rack) 3.0.8
X-UA-Compatible IE=Edge
Cache-Control   no-cache
X-Runtime   0.176543
Status  412
Strict-Transport-Security   max-age=172800, includeSubDomains
Keep-Alive  timeout=15, max=100
Connection  Keep-Alive
Transfer-Encoding   chunked
Content-Type    text/javascript; charset=utf-8

body 仍然是 alert("error");。但它不会发出警报。

这是浏览器限制(我使用的是 Firefox 7b),还是可以使其与 rails 一起使用?

如果我想让我的javascript被执行,我必须总是使用200吗?

【问题讨论】:

    标签: javascript ajax ruby-on-rails-3 http-headers ruby-on-rails-3.1


    【解决方案1】:

    每个状态码都有一个含义,200 表示请求已成功完成。当您收到其他 4xx 或 5xx 代码时,这意味着那里有一些错误并且脚本没有运行/返回成功的响应。在这种情况下,您不应该期望相同的输出,但是您可以在 Javascript 代码中处理这种情况并显示一些有意义的消息,以防请求发生错误。

    【讨论】:

    • 是的,这正是我在没有412-response 的第一个示例中所做的。但是如果有错误,它不应该回复200 successful!因为,好吧,它并不成功。但这似乎破坏了 javascript 解析。
    • 能否请您发布处理响应的 JavaScript 代码?
    • @markus:我会说 HTTP 状态代码只是语义上的。如果你只返回 200 也没关系。
    • @Ankit Jaiswal:我用普通的 javascript 警告框替换了我的部分。我只是想让警报触发。
    • @pimvdb:我觉得这样做是不对的。不过,也许我不得不忍受这一点。
    【解决方案2】:

    如果200 以外的任何东西造成麻烦,为什么不直接返回。无论如何,除非他们深入研究 HTTP 标头,否则没有人会真正看到响应代码。

    我不知道为什么它不起作用,但老实说,我认为你不应该让自己太难。

    毕竟HTTP请求是成功的,所以200的HTTP响应确实很合适。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2020-02-23
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多