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 が削除されました」をググったところ、最終的にこのコミットを見つけました。

($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 に答える