5

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

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

你的 Rails ApplicationController 会这样响应:

   def your_service

      # do some stuff

      respond_to do |format|
         format.js { render 'shared/common_js' }
      end
   end

使用 angular 1.0.x 一切顺利,您的服务回答 OK 200。

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

4

1 回答 1

18

我花了几个小时调查这个,希望这会节省别人的时间。

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

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-Requested-With: XMLHttpRequest removed”,我终于发现了这个提交:

($http):从标头默认值中删除“X-Requested-With” https://github.com/angular/angular.js/commit/3a75b1124d062f64093a90b26630938558909e8d

(此删除是一些讨论的结果,基本上是为了允许更顺畅的 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');
                             }
                         );

否则,如提交中所述,您可以像这样带回丢失的标头:

myAppModule.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);

希望这有帮助,干杯。

于 2013-01-08T16:56:52.720 回答