Ruby on rails $http get to a Rails应用程序控制器提供;HTTP错误406不可接受“;针对角度1.1+;建造

Ruby on rails $http get to a Rails应用程序控制器提供;HTTP错误406不可接受“;针对角度1.1+;建造,ruby-on-rails,http-headers,angularjs,Ruby On Rails,Http Headers,Angularjs,如果您正在这样调用Rails服务: $http.get(url).success(successFn) .error( function(data, status, headers, config) { console.log('Failed'); } ); def

如果您正在这样调用Rails服务:

 $http.get(url).success(successFn)
               .error(
                      function(data, status, headers, config) {
                               console.log('Failed');
                      }
                     );
   def your_service

      # do some stuff

      respond_to do |format|
         format.js { render 'shared/common_js' }
      end
   end
myAppModule.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
Rails应用程序控制器的响应如下:

 $http.get(url).success(successFn)
               .error(
                      function(data, status, headers, config) {
                               console.log('Failed');
                      }
                     );
   def your_service

      # do some stuff

      respond_to do |format|
         format.js { render 'shared/common_js' }
      end
   end
myAppModule.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
使用angular 1.0.x,一切顺利,您的服务回答OK 200


然后我对不稳定的1.1.x版本尝试了相同的代码,但由于HTTP错误406不可接受而停止工作。

我花了几个小时研究这个问题,希望这能节省其他人的时间

在一次调试会话之后,我终于发现不同之处在于请求头:

1.0.3 (at this time):  {X-Requested-With: "XMLHttpRequest", Accept: "application/json, text/plain, */*", X-XSRF-TOKEN: undefined} 

1.1.1 (at this time):  {Accept: "application/json, text/plain, */*", X-XSRF-TOKEN: undefined} 
所以我在谷歌上搜索了“X-request-With:XMLHttpRequest-removed”,最后我发现了这个提交:

($http):从标头默认值中删除“X-request-With”

(此删除是一些讨论的结果,基本上是为了允许更平滑的CORS请求)

通过此删除,Rails无法再通过服务找到路径,即:

format.js { render 'shared/common_js' }  
不再触发(实际上是format.html)

一个可能的解决方案是:

    $http( {method: 'GET', url: url , headers: {'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json, text/plain, */*'}})
           .success(successFn)
           .error(
                           function(data, status, headers, config) {
                               console.log('Fail');
                             }
                         );
否则,如提交中所述,您可以像下面这样带回丢失的头:

 $http.get(url).success(successFn)
               .error(
                      function(data, status, headers, config) {
                               console.log('Failed');
                      }
                     );
   def your_service

      # do some stuff

      respond_to do |format|
         format.js { render 'shared/common_js' }
      end
   end
myAppModule.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);

希望这有帮助,干杯。

那么问题是什么呢?问题是我一直很难找到解决方案,所以我只想指出它,以便其他人可以用谷歌搜索它。好吧,这不是合适的地方。请看常见问题解答。你可以将它发布到你的博客上,或者发布问题,然后自己回答并接受。Tahnks Nishant,我会尽快重新格式化问题。关键是,对我来说,stackoverflow是一个非常有价值的资源(我从这里开始,如果我找不到任何相关的东西,我就开始在网上搜索),所以我认为最好把它放在这里。无论如何,谢谢。我想我必须等几个小时才能给出答案:“声誉低于10的用户在提问后8小时内无法回答他们自己的问题。你可以在7小时内自行回答。”谢谢。。这节省了我很多时间。。我想知道他们为什么取消了违约。我不太明白…非常感谢你花了这么多时间来寻找这个解决方案,所以我不必这么做。开箱即用。这是唯一对我有效的解决方案。我的问题与问题中描述的完全相同。我正在使用Angular 1.2.18和Rails 4.0.2。感谢您的支持。我重新获得了一些信心:抱歉,如果这听起来有点“浮华”,但如果是为了某个主持人,我从一开始就不会发布这个问题。。。无论如何,我很感激。这对我来说还是一个误会,尽管这适合快速修复,谢谢。