RSS/Atom akışları

Önemli API'ler

Windows.Web.Syndication ad alanındaki özellikleri kullanarak, RSS ve Atom standartlarına göre oluşturulan özet akışlar aracılığıyla en güncel ve popüler Web içeriğini alın veya oluşturun.

Note

ve Windows.Web.Syndication API'leriWindows.Web.AtomPub, Hem WinUI 3 (Windows Uygulama SDK'sı) masaüstü uygulamalarında hem de UWP uygulamalarında çalışan Windows Çalışma Zamanı (WinRT) API'lerdir.

Akış nedir?

Web akışı, metin, bağlantı ve görüntülerden oluşan herhangi bir sayıda bağımsız girdi içeren bir belgedir. Bir akışta yapılan güncelleştirmeler, Web'de en son içeriği yükseltmek için kullanılan yeni girişler biçimindedir. İçerik tüketicileri, herhangi bir sayıda tek tek içerik yazarının akışlarını toplamak ve izlemek için bir akış okuyucu uygulaması kullanarak en son içeriğe hızlı ve rahat bir şekilde erişebilir.

Hangi akış biçimi standartları desteklenir?

Windows 0,91'den RSS 2.0'a kadar RSS biçim standartları için akış alımını ve 0,3 ile 1,0 arasında Atom standartlarını destekler. Windows.Web.Syndication ad alanındaki sınıflar, hem RSS hem de Atom öğelerini temsil edebilen özet akışlar ve özet akış öğeleri tanımlayabilir.

Buna ek olarak, Atom 1.0 ve RSS 2.0 biçimlerinin her ikisi de akış belgelerinin resmi belirtimlerde tanımlanmayan öğeler veya öznitelikler içermesine olanak sağlar. Zaman içinde bu özel öğeler ve öznitelikler, GData ve OData gibi diğer web hizmeti veri biçimleri tarafından kullanılan etki alanına özgü bilgileri tanımlamanın bir yolu haline gelmiştir. Bu eklenen özelliği desteklemek için SyndicationNode sınıfı genel XML öğelerini temsil eder. Windows.Data.Xml.Dom ad alanındaki sınıflarla SyndicationNode kullanmak, uygulamaların özniteliklere, uzantılara ve içerebilecekleri herhangi bir içeriğe erişmesine olanak tanır.

Dağıtılmış içeriğin yayımlanması için, Atom Publication Protocol’ün Windows uygulamasının (Windows.Web.AtomPub) yalnızca Atom ve Atom Yayınlama standartlarına uygun akış içeriği işlemlerini desteklediğini unutmayın.

Ağ yalıtımı ile genelleştirilmiş içerik kullanma

Windows'daki ağ yalıtımı özelliği, bir geliştiricinin Windows bir uygulama tarafından ağ erişimini denetlemesine ve sınırlamasına olanak tanır. Tüm uygulamalar ağa erişim gerektirmeyebilir. Ancak Windows, bunu yapan uygulamalar için uygun özellikler seçilerek etkinleştirilebilen ağa farklı erişim düzeyleri sağlar.

Ağ yalıtımı, bir geliştiricinin her uygulama için gerekli ağ erişiminin kapsamını tanımlamasını sağlar. Uygun kapsamı tanımlı olmayan bir uygulamanın belirtilen ağ türüne ve belirli ağ isteği türüne (giden istemci tarafından başlatılan istekler veya hem gelen istenmeyen istekler hem de giden istemci tarafından başlatılan istekler) erişmesi engellenir. Ağ yalıtımını ayarlama ve uygulama olanağı, bir uygulama ele geçirilse bile yalnızca açıkça erişim izni verilmiş ağlara erişebilmesini sağlar. Bu, diğer uygulamalar ve Windows üzerindeki etkinin kapsamını önemli ölçüde azaltır.

Ağ yalıtımı, ağa erişmeye çalışan Windows.Web.Syndication ve Windows.Web.AtomPub ad alanlarındaki tüm sınıf öğelerini etkiler. Windows, ağ yalıtımını etkin bir şekilde zorlar. Windows.Web.Syndication veya Windows.Web.AtomPub ad alanındaki bir sınıf öğesine yapılan ve ağ erişimiyle sonuçlanan bir çağrı, uygun ağ özelliği etkinleştirilmemişse ağ yalıtımı nedeniyle başarısız olabilir.

Bir uygulamanın ağ özellikleri, uygulama oluşturulduğunda uygulama bildiriminde yapılandırılır. Ağ özellikleri genellikle uygulamayı geliştirirken Visual Studio kullanılarak eklenir. Ağ özellikleri, bir metin düzenleyicisi kullanılarak uygulama bildirim dosyasında el ile de ayarlanabilir.

Ağ yalıtımı ve ağ özellikleri hakkında daha ayrıntılı bilgi için Ağ temelleri konusunun "Özellikler" bölümüne bakın.

Web akışına erişme

Bu bölümde, C# ile yazılmış Windows uygulamanızda Windows.Web.Syndication ad alanındaki sınıfları kullanarak bir web beslemesinin nasıl alınacağını ve görüntüleneceğini gösterir.

Ön Koşullar

Windows uygulamanızın ağ için hazır olduğundan emin olmak için Package.appxmanifest projesi dosyasında gereken tüm ağ özelliklerini ayarlamanız gerekir. Uygulamanızın İnternet'te uzak hizmetlere istemci olarak bağlanması gerekiyorsa internetClient özelliği gereklidir. Daha fazla bilgi için Ağ temelleri konusunun "Özellikler" bölümüne bakın.

Web akışından genelleştirilmiş içerik alma

Şimdi bir akışın nasıl alınacağını gösteren bazı kodları gözden geçireceğiz ve akışın içerdiği her bir öğeyi görüntüleyeceğiz. İsteği yapılandırıp göndermeden önce, işlem sırasında kullanacağımız birkaç değişken tanımlayacak ve akışı almak ve görüntülemek için kullanacağımız yöntemleri ve özellikleri tanımlayan bir SyndicationClient örneği başlatacağız.

Oluşturucuya geçirilen uriString geçerli bir URI değilse, Uri oluşturucu bir özel durum oluşturur. Bu nedenle try/catch bloğu kullanarak uriString'i doğrularız.

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

Bu makaledeki JavaScript örnekleri, UWP JavaScript uygulamaları için eski bir çerçeve olan WinJS 'yi (JavaScript için Windows Kitaplığı) kullanır. Bu örnekler yalnızca başvuru için sağlanır ve yeni uygulama geliştirme için önerilmez.

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

Ardından, gerekli tüm Sunucu kimlik bilgilerini ( ServerCredential özelliği), proxy kimlik bilgilerini ( ProxyCredential özelliği) ve HTTP üst bilgilerini ( SetRequestHeader yöntemi) ayarlayarak isteği yapılandıracağız. Temel istek parametreleri yapılandırıldığında, uygulama tarafından sağlanan bir akış URI dizesi kullanılarak oluşturulan geçerli bir Uri nesnesi. Uri nesnesi daha sonra akışı istemek için RetrieveFeedAsync işlevine geçirilir.

İstenen akış içeriğinin döndürüldüğ varsayıldığında, örnek kod her akış öğesinde yinelenir ve öğeleri ve içeriklerini kullanıcı arabirimi aracılığıyla liste olarak görüntülemek için displayCurrentItem (bundan sonra tanımlıyoruz) çağrısı yapılır.

Zaman uyumsuz ağ yöntemlerinin çoğunu çağırdığınızda özel durumları işlemek için kod yazmanız gerekir. Özel durum işleyiciniz, hatayı daha iyi anlamak ve uygun kararlar almak için özel durumun nedeni hakkında daha ayrıntılı bilgi alabilir.

HTTP sunucusuyla bağlantı kurulamadıysa veya Uri nesnesi geçerli bir AtomPub veya RSS akışına işaret etmiyorsa RetrieveFeedAsync yöntemi bir özel durum oluşturur. JavaScript örnek kodu, özel durumları yakalamak ve hata oluşması durumunda özel durum hakkında daha ayrıntılı bilgi yazdırmak için onError işlevini kullanır.

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

Önceki adımda RetrieveFeedAsync istenen akış içeriğini döndürdü ve örnek kodun kullanılabilir akış öğeleri arasında yineleme yapmaya çalışması gerekiyor. Bu öğelerin her biri, ilgili dağıtım standardı (RSS veya Atom) tarafından sunulan tüm öğe özelliklerini ve içeriğini içeren bir SyndicationItem nesnesi kullanılarak temsil edilir. Aşağıdaki örnekte displayCurrentItem işlevinin her öğe üzerinde çalıştığını ve çeşitli adlandırılmış UI öğeleri aracılığıyla içeriğini görüntüleyişini gözlemledik.

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.

Daha önce önerileceği gibi, SyndicationItem nesnesi tarafından temsil edilen içerik türü, akışı yayımlamak için kullanılan akış standardına (RSS veya Atom) bağlı olarak farklılık gösterir. Örneğin, Bir Atom akışı Katkıda Bulunanların listesini sağlama yeteneğine sahiptir, ancak RSS akışı sağlanmaz. Ancak, bir akış öğesinde bulunan ve standart (örneğin, Dublin Core uzantı öğeleri) tarafından desteklenmeyen uzantı öğelerine SyndicationItem.ElementExtensions özelliği kullanılarak erişilebilir ve ardından aşağıdaki örnek kodda gösterildiği gibi görüntülenebilir.

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