4

同じドメインに存在しないAngularアプリケーションで使用するために、http://blog.neosavvy.com/ ?feed=rss2などからブログフィードを取得したいと思います。

ProxyPassを使用するつもりでしたが、ProxyPassは/?feed=rss2では機能しません。同じURLにないものをフェッチするときにJavascriptが持つクロスドメインの問題を回避するために使用できる書き換えルールはありますか?

他のサービスと同じように、AngularJSのサービスを使用してフィードコンテンツをフェッチします。

ブログのRSSを取得するために使用しているコードは次のとおりです。

$scope.getBlogPost = function() {
    $http({method:'GET', url:'http://blog.neosavvy.com/?feed=rss2'}).
        success(function (data, status, headers, config) {
            console.log("data returned");
        }).
        error(function (data, status, headers, config) {
            console.log("data not returned");
        });
}

これが私が受け取るエラーです-したがって、プロキシパスまたはいくつかの代替手段が必要です。

XMLHttpRequestはhttp://blog.neosavvy.com/?feed=rss2をロードできません。Origin http://local.something.comは、Access-Control-Allow-Originでは許可されていません。

4

2 に答える 2

7

YQLやGoogleFeedAPIなどを使用できます

後者を使用して例を作成しました。これは、http://plnkr.co/edit/Plb1fz ?p=previewで確認できます。

サービスを使用する代わりに$http、Google Feed APIを使用すると、コントローラーは次のようになります。

app.controller('ctrl', function($scope) {
  var feed = new google.feeds.Feed("http://blog.neosavvy.com/?feed=rss2");
  feed.load(function(result) {
    $scope.$apply(function(){
      $scope.entries = result.feed.entries;
    })
  });
});

スコープがAngularの外部から変更されるため、$applyAngularに通知するにはへの呼び出しが必要であることに注意してください。

いくつかの考慮事項、最初に次のスクリプトをドキュメントに追加する必要があります

次に、Google Feed APIを最初にロードする必要があるため、Angularアプリを手動でブートストラップする必要があります

google.load("feeds", "1");
google.setOnLoadCallback(function(){     
    angular.bootstrap(document.body, ['app']);
});

フィードにはhtmlが含まれているため、ngSanitizeモジュールを依存関係として宣言します

var app = angular.module('app', ['ngSanitize']);

フィード内のエントリを表示するには、を使用して受信したエントリを反復処理し、もちろんディレクティブを使用ngRepeaterしてhtmlをサニタイズできます。ng-bind-html

<div ng-repeat='entry in entries'>
  <h1>{{entry.title}}</h1>
  <div ng-bind-html= "entry.content"></div>
</div>
于 2012-12-09T00:59:56.760 に答える
0

問題のURLはRSSフィードです。クロスサイトスクリプティングに関する考慮事項はありません。RSSは、どこからでも取得できるようにすることを目的としたXML形式です。

ほぼすべてのJavaScriptフレームワークが、あなたが求めていることを実行します。ウィキペディアの「RSS」

于 2012-12-08T22:56:38.097 に答える