Informační kanály RSS/Atom

důležitá rozhraní API

Načtěte nebo vytvořte nejaktuálnější a nejoblíbenější webový obsah pomocí syndikovaných informačních kanálů generovaných podle standardů RSS a Atom pomocí funkcí v oboru názvů Windows.Web.Syndication.

Note

Rozhraní API Windows.Web.Syndication a Windows.Web.AtomPub jsou rozhraní prostředí Windows Runtime (WinRT), která fungují v desktopových aplikacích WinUI 3 (Windows App SDK) i v aplikacích UWP.

Co je informační kanál?

Webový informační kanál je dokument, který obsahuje libovolný počet jednotlivých položek tvořených textem, odkazy a obrázky. Aktualizace informačního kanálu jsou ve formě nových položek, které slouží k propagaci nejnovějšího obsahu na webu. Příjemci obsahu můžou pomocí aplikace pro čtení informačních kanálů agregovat a monitorovat informační kanály od libovolného počtu jednotlivých autorů obsahu a získat tak přístup k nejnovějšímu obsahu rychle a pohodlně.

Které standardy formátu zdroje jsou podporovány?

Windows podporuje načítání informačních kanálů pro standardy formátu RSS od 0.91 do RSS 2.0 a standardy Atom od 0.3 do 1.0. Třídy v oboru názvů Windows.Web.Syndication mohou definovat informační kanály a položky kanálu schopné reprezentovat prvky RSS i Atom.

Kromě toho atom 1.0 a RSS 2.0 formáty umožňují, aby dokumenty informačního kanálu obsahovaly prvky nebo atributy, které nejsou definovány v oficiálních specifikacích. V průběhu času se tyto vlastní prvky a atributy staly způsobem, jak definovat informace specifické pro doménu využívané jinými formáty dat webové služby, jako jsou GData a OData. Pro podporu této přidané funkce , SyndicationNode třída představuje obecné XML elementy. Použití SyndicationNode spolu s třídami v oboru názvů Windows.Data.Xml.Dom umožňuje aplikacím přistupovat k atributům, rozšířením a jakémukoli obsahu, které mohou obsahovat.

Všimněte si, že pro publikování syndikovaného obsahu Windows implementace protokolu Atom Publication Protocol (Windows. Web.AtomPub) podporuje pouze operace obsahu informačního kanálu podle standardů Atom a Atom Publication.

Použití syndikovaného obsahu s izolací sítě

Funkce izolace sítě v Windows umožňuje vývojáři řídit a omezovat síťový přístup aplikací Windows. Ne všechny aplikace můžou vyžadovat přístup k síti. Pro aplikace, které to dělají, Windows poskytuje různé úrovně přístupu k síti, které je možné povolit výběrem vhodných možností.

Izolace sítě umožňuje vývojářům definovat pro každou aplikaci rozsah požadovaného síťového přístupu. Aplikaci, která nemá definovaný odpovídající rozsah oprávnění, je zabráněno v přístupu k určenému typu sítě a ke konkrétnímu typu síťových požadavků (odchozí požadavky iniciované klientem nebo jak příchozí nevyžádané požadavky, tak odchozí požadavky iniciované klientem). Možnost nastavit a vynutit izolaci sítě zajišťuje, že pokud dojde k ohrožení zabezpečení aplikace, může přistupovat pouze k sítím, kde má aplikace explicitně udělený přístup. Tím se výrazně sníží rozsah dopadu na jiné aplikace a na Windows.

Izolace sítě ovlivňuje všechny prvky tříd v oborech názvů Windows.Web.Syndication a Windows.Web.AtomPub, které se pokoušejí přistupovat k síti. Windows aktivně vynucuje izolaci sítě. Volání prvku třídy v oboru názvů Windows.Web.Syndication nebo Windows.Web.AtomPub, které vede k přístupu k síti, může selhat kvůli izolaci sítě, pokud nebyla povolena příslušná síťová schopnost.

Možnosti sítě pro aplikaci se konfigurují v manifestu aplikace při vytváření aplikace. Možnosti sítě se při vývoji aplikace obvykle přidávají pomocí Visual Studio. Možnosti sítě můžou být také ručně nastaveny v souboru manifestu aplikace pomocí textového editoru.

Podrobnější informace o izolaci sítě a možnostech sítě najdete v části Možnosti v tématu Základy sítě .

Jak získat přístup k webovému informačnímu kanálu

Tato část ukazuje, jak získat a zobrazit webový informační kanál pomocí tříd v oboru názvů Windows.Web.Syndication ve vaší aplikaci pro Windows napsané v jazyce C#.

Předpoklady

Abyste měli jistotu, že je aplikace Windows připravená pro síť, musíte nastavit všechny síťové funkce potřebné v souboru Package.appxmanifest projektu. Pokud se vaše aplikace potřebuje připojit jako klient ke vzdáleným službám na internetu, je potřeba funkce internetClient . Další informace najdete v části Možnosti v tématu Základy sítě .

Načítání syndikovaného obsahu z webového kanálu

Teď si projdeme kód, který ukazuje, jak načíst informační kanál, a pak zobrazíme jednotlivé položky, které informační kanál obsahuje. Než budeme moct nakonfigurovat a odeslat požadavek, definujeme několik proměnných, které budeme používat během operace, a inicializujeme instanci SyndicationClient, která definuje metody a vlastnosti, které použijeme k načtení a zobrazení informačního kanálu.

Konstruktor URI vyvolá výjimku, pokud uriString předaný konstruktoru není platný identifikátor URI. Proto ověříme uriString pomocí bloku try/catch.

Windows.Web.Syndication.SyndicationClient client = new Windows.Web.Syndication.SyndicationClient();
Windows.Web.Syndication.SyndicationFeed feed;
// The URI is validated by catching exceptions thrown by the Uri constructor.
Uri uri = null;
// Use your own uriString for the feed you are connecting to.
string uriString = "";
try
{
    uri = new Uri(uriString);
}
catch (Exception ex)
{
    // Handle the invalid URI here.
}

Note

Ukázky JavaScriptu v tomto článku používají WinJS (Windows Library for JavaScript), což je starší architektura pro javascriptové aplikace pro UPW. Tyto ukázky jsou k dispozici pouze pro referenci a nedoporučuje se pro vývoj nových aplikací.

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;
}

Dále nakonfigurujeme požadavek tak, že nastavíme všechny přihlašovací údaje serveru (vlastnost ServerCredential ), proxy přihlašovací údaje ( vlastnost ProxyCredential ) a hlavičky HTTP (metoda SetRequestHeader ). S nakonfigurovanými základními parametry požadavku je platný objekt URI vytvořený pomocí řetězce identifikátoru URI informačního kanálu poskytovaného aplikací. Objekt Uri se pak předá funkci RetrieveFeedAsync k vyžádání informačního kanálu.

Za předpokladu, že se vrátil požadovaný obsah informačního kanálu, ukázkový kód prochází každou položkou informačního kanálu, volá displayCurrentItem (který definujeme dále), aby se položky a jejich obsah zobrazovaly jako seznam prostřednictvím uživatelského rozhraní.

Při volání většiny asynchronních síťových metod je nutné napsat kód pro zpracování výjimek. Vaše obslužná rutina pro zpracování výjimek může získat podrobnější informace o příčině výjimky, abyste lépe porozuměli selhání a mohli učinit vhodná rozhodnutí.

Metoda RetrieveFeedAsync vyvolá výjimku, pokud nelze navázat připojení se serverem HTTP nebo objekt Uri neodkazuje na platný informační kanál AtomPub nebo RSS. Vzorový kód Jazyka JavaScript používá funkci onError k zachycení všech výjimek a k zobrazení podrobnějších informací o výjimce, pokud dojde k chybě.

try
{
    // 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)");
    feed = await client.RetrieveFeedAsync(uri);
    // Retrieve the title of the feed and store it in a string.
    string title = feed.Title.Text;
    // Iterate through each feed item.
    foreach (Windows.Web.Syndication.SyndicationItem item in feed.Items)
    {
        displayCurrentItem(item);
    }
}
catch (Exception ex)
{
    // Handle the exception here.
}
function onError(err) {
    WinJS.log && WinJS.log(err, "sample", "error");
    // Match error number with an 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);
}

V předchozím kroku metoda RetrieveFeedAsync vrátila požadovaný obsah informačního kanálu a ukázkový kód začal iterovat dostupné položky informačního kanálu. Každá z těchto položek je reprezentována pomocí objektu SyndicationItem , který obsahuje všechny vlastnosti a obsah položky, které jsou k dispozici relevantním syndikačním standardem (RSS nebo Atom). V následujícím příkladu vidíme, že funkce displayCurrentItem pracuje přes každou položku a zobrazuje její obsah prostřednictvím různých pojmenovaných prvků uživatelského rozhraní.

private void displayCurrentItem(Windows.Web.Syndication.SyndicationItem item)
{
    string itemTitle = item.Title == null ? "No title" : item.Title.Text;
    string itemLink = item.Links == null ? "No link" : item.Links.FirstOrDefault().ToString();
    string itemContent = item.Content == null ? "No content" : item.Content.Text;
    //displayCurrentItem is continued below.
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 linkElement = document.getElementById("Link");
    linkElement.innerText = link;
    linkElement.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);
                //displayCurrentItem is continued below.

Jak už bylo navrhováno, typ obsahu reprezentovaný objektem SyndicationItem se bude lišit v závislosti na standardu informačního kanálu (RSS nebo Atom) použitém k publikování informačního kanálu. Například informační kanál Atom je schopný poskytnout seznam přispěvatelů, ale informační kanál RSS není. Prvky rozšíření obsažené v položce informačního kanálu, které nejsou podporovány ani jedním z těchto standardů (například prvky rozšíření Dublin Core), lze zpřístupnit pomocí vlastnosti SyndicationItem.ElementExtensions a poté je zobrazit, jak je ukázáno v následujícím příkladu kódu.

    //displayCurrentItem continued.
    string extensions = "";
    foreach (Windows.Web.Syndication.SyndicationNode node in item.ElementExtensions)
    {
        string nodeName = node.NodeName;
        string nodeNamespace = node.NodeNamespace;
        string nodeValue = node.NodeValue;
        extensions += nodeName + "\n" + nodeNamespace + "\n" + nodeValue + "\n";
    }
    this.listView.Items.Add(itemTitle + "\n" + itemLink + "\n" + itemContent + "\n" + extensions);
}
    // 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
    });
}