RSS/Atom-hírcsatornák

Fontos API-k

A legfrissebb és legnépszerűbb webtartalmak lekérése vagy létrehozása az RSS- és Atom-szabványok szerint előállított szindikált hírcsatornák segítségével, a Windows.Web.Syndication névtér szolgáltatásait használva.

Note

Az Windows.Web.Syndication és Windows.Web.AtomPub AZ API-k Windows-futtatókörnyezet (WinRT) API-k, amelyek a WinUI 3 (Windows App SDK) asztali alkalmazásokban és az UWP-alkalmazásokban működnek.

Mi az a hírcsatorna?

A webes hírcsatornák olyan dokumentumok, amelyek tetszőleges számú, szövegből, hivatkozásból és képből álló bejegyzést tartalmaznak. A hírcsatornák frissítései olyan új bejegyzések formájában jelennek meg, amelyek a legújabb tartalom webes népszerűsítésére szolgálnak. A tartalomfelhasználók egy hírcsatorna-olvasó alkalmazással összesíthetik és figyelhetik az egyes tartalomkészítők hírcsatornáit, így gyorsan és kényelmesen hozzáférhetnek a legújabb tartalmakhoz.

Mely hírcsatornaformátum-szabványok támogatottak?

A Windows támogatja a hírcsatornák lekérését a 0.91-es verziótól az RSS 2.0-ig terjedő RSS-formátumszabványok, valamint a 0.3-as verziótól az 1.0-ig terjedő Atom-szabványok esetében. Osztályok a Windows. A Web.Syndication névtér olyan hírcsatornákat és hírcsatornaelemeket definiálhat, amelyek rss- és Atom-elemeket is képviselhetnek.

Emellett az Atom 1.0 és az RSS 2.0 formátum egyaránt lehetővé teszi a hírcsatorna-dokumentumok számára, hogy a hivatalos specifikációkban nem meghatározott elemeket vagy attribútumokat tartalmazzanak. Idővel ezek az egyéni elemek és attribútumok lehetővé váltak a más webszolgáltatás-adatformátumok, például a GData és az OData által felhasznált tartományspecifikus információk meghatározására. A hozzáadott funkció támogatásához a SyndicationNode osztály általános XML-elemeket jelöl. A(z) SyndicationNode használata a Windows.Data.Xml.Dom névtérben található osztályokkal lehetővé teszi az alkalmazások számára, hogy hozzáférjenek az attribútumokhoz, a kiterjesztésekhez és az általuk esetleg tartalmazott bármilyen tartalomhoz.

Vegye figyelembe, hogy a szindikált tartalom közzétételéhez az Atom Publication Protocol Windows-implementációja (Windows.Web.AtomPub) csak az Atom és az Atom Publishing szabványoknak megfelelő hírcsatorna-tartalomműveleteket támogatja.

Szindikált tartalom használata hálózati elkülönítéssel

A Windows hálózatelkülönítési funkciója lehetővé teszi, hogy a fejlesztő szabályozhassa és korlátozza a hálózati hozzáférést egy Windows alkalmazással. Előfordulhat, hogy nem minden alkalmazás igényel hozzáférést a hálózathoz. Az ilyen alkalmazások esetében azonban Windows különböző hozzáférési szinteket biztosít a hálózathoz, amelyek a megfelelő képességek kiválasztásával engedélyezhetők.

A hálózatelkülönítés lehetővé teszi, hogy a fejlesztő minden alkalmazáshoz meghatározza a szükséges hálózati hozzáférés hatókörét. A megfelelő hatókörrel nem rendelkező alkalmazások nem férhetnek hozzá a megadott hálózattípushoz és a hálózati kérések adott típusához (kimenő ügyfél által kezdeményezett kérések vagy bejövő kéretlen kérések és kimenő ügyfél által kezdeményezett kérések). A hálózatelkülönítés beállításának és kényszerítésének lehetősége biztosítja, hogy ha egy alkalmazás biztonsága sérül, csak olyan hálózatokhoz fér hozzá, amelyekhez az alkalmazás kifejezetten hozzáférést kapott. Ez jelentősen csökkenti a más alkalmazásokra és a Windows gyakorolt hatás hatókörét.

A hálózatelkülönítés hatással van a Windows.Web.Syndication és a Windows.Web.AtomPub névterek minden olyan osztályelemére, amelyek megpróbálnak hozzáférni a hálózathoz. Windows aktívan kényszeríti a hálózatelkülönítést. A(z) Windows.Web.Syndication vagy Windows.Web.AtomPub névtér egy osztályelemének olyan hívása, amely hálózati hozzáférést eredményez, a hálózati elkülönítés miatt meghiúsulhat, ha a megfelelő hálózati képesség nincs engedélyezve.

Az alkalmazás hálózati képességei az alkalmazás létrehozásakor az alkalmazásjegyzékben vannak konfigurálva. A hálózati képességeket általában Visual Studio használatával adjuk hozzá az alkalmazás fejlesztésekor. A hálózati képességek manuálisan is beállíthatók az alkalmazásjegyzékfájlban egy szövegszerkesztő használatával.

A hálózatelkülönítéssel és a hálózatkezelési képességekkel kapcsolatos részletesebb információkért tekintse meg a Hálózatkezelés alapjai témakör "Képességek" szakaszát.

Webes hírcsatorna elérése

Ez a szakasz bemutatja, hogyan kérhet le és jeleníthet meg egy webes hírforrást a Windows.Web.Syndication névtér osztályainak használatával az Ön C# nyelven írt Windows-alkalmazásában.

Előfeltételek

Ahhoz, hogy az Windows alkalmazás hálózatra kész legyen, be kell állítania a Package.appxmanifest projektfájlban szükséges hálózati képességeket. Ha az alkalmazásnak ügyfélként kell csatlakoznia az interneten található távoli szolgáltatásokhoz, akkor az internetClient funkcióra van szükség. További információt a Hálózatkezelési alapismeretek témakör "Képességek" című szakaszában talál.

Tartalom lekérése webes hírcsatornából

Most áttekintünk néhány kódot, amely bemutatja, hogyan lehet beolvasni egy hírcsatornát, majd megjelenítjük az egyes elemeket, amelyeket a hírcsatorna tartalmaz. Mielőtt konfigurálhatnánk és elküldhetnénk a kérést, meghatározunk néhány változót, amelyeket a művelet során használunk, és inicializáljuk a SyndicationClient egy példányát, amely meghatározza azokat a metódusokat és tulajdonságokat, amelyeket a hírcsatorna lekéréséhez és megjelenítéséhez használunk.

Az Uri konstruktor kivételt jelez, ha a konstruktornak átadott uriString nem érvényes URI. Ezért egy try/catch blokk használatával érvényesítjük a uriString-et.

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

A cikkben szereplő JavaScript-minták a WinJS-t (Windows JavaScript-kódtárat) használják, amely az UWP JavaScript-alkalmazások régi keretrendszere. Ezek a minták csak referenciaként szolgálnak, és nem ajánlottak új alkalmazásfejlesztéshez.

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

Ezután konfiguráljuk a kérést úgy, hogy beállítjuk a kiszolgálói hitelesítő adatokat (a ServerCredential tulajdonságot), a proxy hitelesítő adatait (a ProxyCredential tulajdonságot) és a HTTP-fejléceket (a SetRequestHeader metódust). Az alapvető kérési paraméterek konfigurálása után egy érvényes Uri objektum, amely az alkalmazás által megadott hírcsatorna-URI karakterlánca alapján jön létre. Az Uri-objektum ezután a RetrieveFeedAsync függvénynek továbbítja a hírcsatorna kéréséhez.

Feltételezve, hogy a kívánt hírcsatorna-tartalom vissza lett adva, a példakód végigfut az egyes hírcsatornaelemeken, és meghívja a displayCurrentItem (amelyet a következőben határozunk meg) meghívásával, hogy listaként jelenítse meg az elemeket és azok tartalmát a felhasználói felületen keresztül.

A legtöbb aszinkron hálózati metódus meghívásakor a kivételek kezeléséhez kódot kell írnia. A kivételkezelő részletesebb információkat tud lekérni a kivétel okáról a hiba jobb megértése és a megfelelő döntések meghozatala érdekében.

A RetrieveFeedAsync metódus kivételt okoz, ha nem sikerült kapcsolatot létesíteni a HTTP-kiszolgálóval, vagy az Uri objektum nem mutat érvényes AtomPub- vagy RSS-hírcsatornára. A JavaScript-mintakód egy onError függvénnyel észleli a kivételeket, és hiba esetén részletesebb információkat nyomtat ki a kivételről.

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

Az előző lépésben a RetrieveFeedAsync visszaadta a kért hírcsatornatartalmat, és a példakódnak iterálnia kellett az elérhető hírcsatornákon keresztül. Mindegyik elem egy SyndicationItem objektummal jelenik meg, amely tartalmazza a vonatkozó szindikálási szabvány (RSS vagy Atom) által biztosított összes elemtulajdonságt és tartalmat. Az alábbi példában megfigyeljük a displayCurrentItem függvényt, amely az egyes elemeken dolgozik, és a tartalmát különböző nevesített felhasználói felületi elemeken keresztül jeleníti meg.

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.

Ahogy korábban javasoltuk, a SyndicationItem objektum által képviselt tartalom típusa a hírcsatorna közzétételéhez használt hírcsatorna szabványától (RSS vagy Atom) függően eltérő lesz. Egy Atom-hírcsatorna például képes a közreműködők listájának megadására, de az RSS-hírcsatorna nem. A hírcsatornaelemekben szereplő olyan bővítményelemek azonban, amelyeket egyik szabvány sem támogat (például a Dublin Core bővítményelemei) a SyndicationItem.ElementExtensions tulajdonsággal érhetők el, majd az alábbi példakódban bemutatott módon jelennek meg.

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