406在Firefox中使用Jquery $ .post但在Safari或Chrome中不使用时出现不可接受的错误
我正在使用Jquery(1.3.2)$ .post命令来触发对rails服务器的ajax调用。
该代码在Safari和Google Chrome(Mac)上运行良好,但是当我在Firefox(3.5.7)上尝试时,我得到了一个奇怪的“406 Not Acceptable”错误。
当我查看标题时,Firefox表示它只接受’text / javascript’响应。 并且响应Content-Type是’text / html; 字符集= UTF-8′ 。
在Chrome中,接受的类型是’application / json,text / javascript, / ,text / javascript’,响应Content-Type是’application / json; 字符集= UTF-8′ 。
我试图将rails中的内容类型强制为’text / javascript’
format.json do render :json => @races.to_json, :content_type => 'text/javascript' end
Chrome中的内容类型确实已更改,但Firefox中的内容类型仍为“text / html”。
这是我用来触发ajax调用的代码。
$.post( "/locator", params, function(data){...}, "json" );
我有什么办法可以让它在Firefox中运行吗? 谢谢
在post调用中为您的URL添加.json扩展名
$.post( "/locator.json" ...
或者(可能更好)将以下内容添加到application.js以设置所有ajax请求的标头
jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} })
有同样的问题。 这似乎是一个火狐问题。
这有效:
jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript,application/javascript,text/html")} })
信用转到这个博客。
最好的祝福。 AsbjørnMorell
不同的浏览器看到不同的HTTP标头是没有意义的。 也许这是一个缓存问题。
我在$ .ajaxSetup调用期间使用contentType选项来显式设置内容类型。 跨浏览器的工作: http : //api.jquery.com/jQuery.ajax/
以上建议都没有(atmorell,Paul Groves)为我修复了…然后我发现jquery $ .ajax不能在firefox中使用rails(406响应)(适用于chrome和IE)
正如我在那里评论的那样,接受的答案有效! (使用format.js而不是format.json,以及“render:text => item.to_json”)
为了记录,我不是直接的.ajax电话; 而我正在使用JQuery.UI的自动完成器:
$(document).ready(function() { $("input#task_summary_task_wbs").autocomplete({ source: "/tasks/summary.js" }); });
这在我的TasksController中:
# GET /tasks/summary.js def summary @tasks = Task.find(:all, :conditions => ['is_summary = true AND wbs like ?', "%#{params[:term]}%"], :order => :wbs) respond_to do |format| format.js { render :text => @tasks.collect {|t| t.wbs_name}.to_json } end end
la Railscast#102。