So wird’s gemacht: Zugreifen auf einen Webfeed (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

In diesem Thema wird beschrieben, wie Sie einen Webfeed mithilfe von Klassen im Windows.Web.Syndication-Namespace der Windows-Runtime-App abrufen und anzeigen.

Voraussetzungen

In den folgenden Beispielen wird JavaScript verwendet. Sie basieren auf dem Beispiel für die Veröffentlichung. Allgemeine Informationen zum Erstellen einer Windows-Runtime-App mit JavaScript finden Sie unter Erstellen Ihrer ersten Windows-Runtime-App mit JavaScript. Darüber hinaus werden in diesem Thema JavaScript-Zusagen zum Ausführen asynchroner Vorgänge verwendet. Weitere Informationen zu diesem Programmierungsmuster finden Sie unter Asynchrone Programmierung in JavaScript mit Zusagen.

Damit die Windows-Runtime-App im Netzwerk verwendet werden kann, müssen Sie alle erforderlichen Netzwerkfunktionen in der Projektdatei Package.appxmanifest festlegen. Wenn Ihre App als Client eine Verbindung mit Remotediensten im Internet herstellen muss, ist die Funktion Internet (Client) erforderlich. Wenn die App als Client eine Verbindung mit Remotediensten in einem Heim- oder Arbeitsplatznetzwerk herstellen muss, ist die Funktion Heim- oder Arbeitsplatznetzwerke erforderlich. Weitere Informationen finden Sie unter So wird's gemacht: Festlegen von Netzwerkfunktionen.

Anweisungen

Abrufen von Fremdinhalten aus einem Webfeed

Nun sehen wir uns etwas Code an, der demonstriert, wie ein Feed abgerufen werden kann und anschließend die einzelnen Elemente des Feeds angezeigt werden können. Bevor wir die Anforderung konfigurieren und senden können, definieren wir einige Variablen, die wir während des Vorgangs verwenden werden, und initialisieren eine Instanz von SyndicationClient, die die Methoden und Eigenschaften definiert, die wir zum Abrufen und Anzeigen des Feeds verwenden.

Der Uri-Konstruktor löst eine Ausnahme aus, wenn das an den Konstruktor übergebene uriString-Element kein gültiger URI ist. Daher überprüfen wir das uriString-Element mithilfe eines try/catch-Blocks.

var currentFeed = null;
var currentItemIndex = 0;
        
var client = new Windows.Web.Syndication.SyndicationClient();

// The URI is validated by catching exceptions thrown by the Uri constructor.
var uri = null;
try {
    uri = new Windows.Foundation.Uri(uriString);
} catch (error) {
    WinJS.log && WinJS.log("Error: Invalid URI");
    return;
}

Anschließend konfigurieren wir die Anforderung, indem wir alle Serveranmeldeinformationen (die serverCredential-Eigenschaft), Proxyanmeldeinformationen (die proxyCredential-Eigenschaft) und HTTP-Header (die setRequestHeader-Methode) festlegen. Nun, da die grundlegenden Anforderungsparameter konfiguriert sind, haben wir ein gültiges, mit einer von der App bereitgestellten Feed-URI-Zeichenfolge erstelltes Uri-Objekt. Das Uri-Objekt wird anschließend an die retrieveFeedAsync-Funktion übergeben, um den Feed anzufordern.

In der Annahme, dass die gewünschten Feedinhalte zurückgegeben wurden, durchläuft der Code jedes Feedelement, wobei er displayCurrentItem aufruft (was wir als nächstes definieren), um Elemente und ihre Inhalte über die UI als Liste anzuzeigen.

Beim Aufrufen der meisten asynchronen Netzwerkmethoden müssen Sie Code zum Behandeln von Ausnahmen schreiben. Ihr Ausnahmehandler kann detailliertere Informationen zur Ursache abrufen, um die Ausnahme besser verstehen und entsprechende Entscheidungen treffen zu können. Weitere Informationen finden Sie unter So wird's gemacht: Behandeln von Ausnahmen in Netzwerk-Apps.

Die retrieveFeedAsync-Methode löst eine Ausnahme aus, wenn keine Verbindung mit dem HTTP-Server hergestellt werden kann oder wenn das Uri-Objekt nicht auf einen gültigen AtomPub- oder RSS-Feed verweist. Im Beispielcode wird eine onError-Funktion verwendet, um etwaige Ausnahmen abzufangen und ausführlichere Informationen zur Ausnahme auszugeben, wenn ein Fehler auftritt.

function onError(err) {
    WinJS.log && WinJS.log(err, "sample", "error");

    // Match error number with a ErrorStatus value.
    // Use Windows.Web.WebErrorStatus.getStatus() to retrieve HTTP error status codes.
    var errorStatus = Windows.Web.Syndication.SyndicationError.getStatus(err.number);
    if (errorStatus === Windows.Web.Syndication.SyndicationErrorStatus.invalidXml) {
        displayLog("An invalid XML exception was thrown. Please make sure to use a URI that points to a RSS or Atom feed.");
    }
}

// Retrieve and display feed at given feed address.
function retreiveFeed(uri) {

    // Although most HTTP servers do not require User-Agent header, 
    // others will reject the request or return a different response if this header is missing.
    // Use the setRequestHeader() method to add custom headers.
    client.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

    client.retrieveFeedAsync(uri).done(function (feed) {
        currentFeed = feed;

        WinJS.log && WinJS.log("Feed download complete.", "sample", "status");

        var title = "(no title)";
        if (currentFeed.title) {
            title = currentFeed.title.text;
        }
        document.getElementById("CurrentFeedTitle").innerText = title;

        currentItemIndex = 0;
        if (currentFeed.items.size > 0) {
            displayCurrentItem();
        }

        // List the items.
        displayLog("Items: " + currentFeed.items.size);
     }, onError);
}

Im vorherigen Schritt hat retrieveFeedAsync die angeforderten Feedinhalte zurückgegeben, und der Beispielcode hat damit begonnen, die verfügbaren Feedelemente zu durchlaufen. Jedes dieser Elemente wird mithilfe eines SyndicationItem-Objekts dargestellt, das alle vom jeweiligen Veröffentlichungsstandard (RSS oder Atom) bereitgestellten Eigenschaften und Inhalte des Elements enthält. Im folgenden Beispiel beobachten wir die displayCurrentItem-Funktion dabei, wie sie die einzelnen Elemente durchgeht und ihre Inhalte über verschieden benannte UI-Elemente ausgibt.

function displayCurrentItem() {
    var item = currentFeed.items[currentItemIndex];

    // Display item number.
    document.getElementById("Index").innerText = (currentItemIndex + 1) + " of " + currentFeed.items.size;

    // Display title.
    var title = "(no title)";
    if (item.title) {
        title = item.title.text;
    }
    document.getElementById("ItemTitle").innerText = title;

    // Display the main link.
    var link = "";
    if (item.links.size > 0) {
        link = item.links[0].uri.absoluteUri;
    }

    var link = document.getElementById("Link");
    link.innerText = link;
    link.href = link;

    // Display the body as HTML.
    var content = "(no content)";
    if (item.content) {
        content = item.content.text;
    }
    else if (item.summary) {
        content = item.summary.text;
    }
    document.getElementById("WebView").innerHTML = window.toStaticHTML(content);

Wie bereits angesprochen, unterscheidet sich der Inhaltstyp, der durch ein SyndicationItem-Objekt dargestellt wird, in Abhängigkeit vom Feedstandard (RSS oder Atom), der für die Veröffentlichung des Feeds genutzt wird. Im Gegensatz zu einem RSS-Feed kann ein Atom-Feed beispielsweise eine Liste mit contributors-Elementen bereitstellen. Auf Erweiterungselemente in einem Feedelement, die von keinem der Standards unterstützt werden (etwa Dublin Core-Erweiterungselemente), kann jedoch mithilfe der SyndicationItem.elementExtensions-Eigenschaft zugegriffen und diese anschließend wie im folgenden Code dargestellt angezeigt werden:


    // displayCurrentItem function continued
    var bindableNodes = [];
    for (var i = 0; i < item.elementExtensions.size; i++) {
        var bindableNode = {
            nodeName: item.elementExtensions[i].nodeName,
             nodeNamespace: item.elementExtensions[i].nodeNamespace,
             nodeValue: item.elementExtensions[i].nodeValue,
        };
        bindableNodes.push(bindableNode);
    }

    var dataList = new WinJS.Binding.List(bindableNodes);
    var listView = document.getElementById("extensionsListView").winControl;
    WinJS.UI.setOptions(listView, {
        itemDataSource: dataList.dataSource

    });
}

Zusammenfassung und nächste Schritte

In diesem Thema wird ein Feed, der mit einem bereitgestellten URI verbunden ist, abgerufen und der Feedinhalt Element für Element angezeigt.

Informationen zu anspruchsvolleren Features wie der Möglichkeit, Einträge in einem Webfeed hinzuzufügen, zu bearbeiten und zu löschen, finden Sie unter So wird's gemacht: Verwalten von Webfeedeinträgen.

Verwandte Themen

Sonstige

Asynchrone Programmierung in JavaScript mit Zusagen

So wird's gemacht: Festlegen von Netzwerkfunktionen

So wird's gemacht: Behandeln von Ausnahmen in Netzwerk-Apps

So wird's gemacht: Verwalten von Webfeedeinträgen

Roadmap für Windows-Runtime-Apps mit JavaScript

Referenzen

SyndicationClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Beispiele

AtomPub-Beispiel

Beispiel für die Veröffentlichung