Веб-каналы RSS и Atom
Важные API
Получите или создайте наиболее актуальное и популярное веб-содержимое с помощью синдикированных веб-каналов, созданных в соответствии со стандартами RSS и Atom с помощью функций в пространстве имен Windows.Web.Syndication.
Что такое веб-канал?
Веб-канал — это документ, содержащий любое количество отдельных записей, состоящих из текста, ссылок и изображений. Обновления, внесенные в веб-канал, находятся в виде новых записей, используемых для продвижения последнего содержимого в Интернете. Потребители содержимого могут использовать приложение чтения веб-каналов для агрегирования и отслеживания веб-каналов от любого количества отдельных авторов контента, получая доступ к последнему содержимому быстро и удобно.
Какие стандарты формата веб-канала поддерживаются?
Универсальная платформа Windows (UWP) поддерживает получение веб-каналов для стандартов формата RSS от 0.91 до RSS 2.0 и Atom с 0.3 до 1.0. Классы в пространстве имен Windows.Web.Syndication могут определять веб-каналы и элементы веб-канала, способные представлять элементы RSS и Atom.
Кроме того, форматы Atom 1.0 и RSS 2.0 позволяют документам веб-канала содержать элементы или атрибуты, не определенные в официальных спецификациях. С течением времени эти пользовательские элементы и атрибуты стали способом определения сведений, используемых для конкретного домена другими форматами данных веб-службы, такими как GData и OData. Для поддержки этой добавленной функции класс SyndicationNode представляет универсальные XML-элементы. Использование SyndicationNode с классами в пространстве имен Windows.Data.Xml.Dom позволяет приложениям получать доступ к атрибутам, расширениям и любому содержимому, которое они могут содержать.
Обратите внимание, что для публикации синдикированного содержимого реализация протокола публикации Atom (Windows.Web.AtomPub) поддерживает только операции содержимого канала в соответствии со стандартами публикации Atom и Atom.
Использование синдикированного содержимого с сетевой изоляцией
Функция сетевой изоляции в UWP позволяет разработчику контролировать и ограничивать доступ к сети приложением UWP. Не всем приложениям может потребоваться доступ к сети. Однако для таких приложений UWP предоставляет различные уровни доступа к сети, которые можно включить, выбрав соответствующие возможности.
Сетевая изоляция позволяет разработчику определять для каждого приложения область требуемого сетевого доступа. Приложению без соответствующей области запрещен доступ к указанному типу сети и конкретному типу сетевого запроса (исходящие запросы, инициированные клиентом, или запросы, инициируемые клиентом, или запросы, инициируемые клиентом, и исходящие запросы). Возможность установить и применить сетевую изоляцию гарантирует, что если приложение скомпрометировано, оно может получить доступ только к сетям, где приложение явно было предоставлено доступ. Это значительно сокращает область влияния на другие приложения и в Windows.
Сетевая изоляция влияет на все элементы класса в пространствах имен Windows.Web.Syndication и Windows.Web.AtomPub, которые пытаются получить доступ к сети. Windows активно применяет сетевую изоляцию. Вызов элемента класса в пространстве имен Windows.Web.Syndication или Windows.Web.AtomPub , который приводит к сбою сетевого доступа из-за изоляции сети, если соответствующая сетевая возможность не включена.
Сетевые возможности для приложения настраиваются в манифесте приложения при создании приложения. Они обычно добавляются с помощью Microsoft Visual Studio 2015 в ходе разработки приложения. Сетевые возможности также можно задать вручную в файле манифеста приложения с помощью текстового редактора.
Дополнительные сведения об изоляции сети и сетевых возможностях см. в разделе "Возможности" раздела "Основы сети".
Доступ к веб-каналу
В этом разделе показано, как получить и отобразить веб-канал с помощью классов в пространстве имен Windows.Web.Syndication в приложении UWP, написанном на C# или JavaScript.
Необходимые условия
Чтобы обеспечить готовность приложения UWP к сети, необходимо задать все сетевые возможности, необходимые в файле project Package.appxmanifest . Если приложению необходимо подключиться в качестве клиента к удаленным службам в Интернете, потребуется возможность InternetClient . Дополнительные сведения см. в разделе "Возможности" в разделе "Основы сети".
Получение сводного содержимого из веб-канала
Теперь мы рассмотрим некоторый код, демонстрирующий, как получить веб-канал, а затем отобразить каждый отдельный элемент, содержащий веб-канал. Прежде чем настроить и отправить запрос, мы определим несколько переменных, которые мы будем использовать во время операции, и инициализировать экземпляр SyndicationClient, который определяет методы и свойства, которые будут использоваться для получения и отображения веб-канала.
Конструктор URI создает исключение, если uriString, переданный конструктору, не является допустимым универсальным кодом ресурса (URI). Поэтому мы проверяем uriString с помощью блока 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.
}
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;
}
Затем мы настраиваем запрос, задав все учетные данные сервера (свойство ServerCredential), учетные данные прокси -сервера (свойство ProxyCredential) и заголовки HTTP (метод SetRequestHeader). При настройке основных параметров запроса допустимый объект URI, созданный с помощью строки URI веб-канала, предоставленной приложением. Затем объект URI передается функции GetFeedAsync для запроса веб-канала.
Предполагая, что содержимое нужного веб-канала было возвращено, пример кода выполняет итерацию каждого элемента веб-канала, вызывая displayCurrentItem (который определяется рядом), чтобы отображать элементы и их содержимое в виде списка через пользовательский интерфейс.
Необходимо написать код для обработки исключений при вызове большинства асинхронных сетевых методов. Обработчик исключений может получить более подробную информацию о причине исключения, чтобы лучше понять ошибку и принять соответствующие решения.
Метод RetrieveFeedAsync создает исключение, если соединение не удалось установить с HTTP-сервером или объектом URI, не указывает на допустимый веб-канал AtomPub или RSS. Пример кода JavaScript использует функцию onError для перехвата исключений и вывода более подробных сведений об исключении при возникновении ошибки.
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);
}
На предыдущем шаге RetrieveFeedAsync вернул запрошенное содержимое веб-канала, а пример кода должен работать путем итерации доступных элементов веб-канала. Каждый из этих элементов представлен с помощью объекта SyndicationItem, который содержит все свойства элемента и содержимое, предоставляемое соответствующим стандартом синдикации (RSS или Atom). В следующем примере мы наблюдаем функцию displayCurrentItem , работающую с каждым элементом, и отображаем ее содержимое с помощью различных именованных элементов пользовательского интерфейса.
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 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);
//displayCurrentItem is continued below.
Как было предложено ранее, тип содержимого, представленного объектом SyndicationItem , будет отличаться в зависимости от стандарта веб-канала (RSS или Atom), используемого для публикации веб-канала. Например, веб-канал Atom может предоставлять список участников, но RSS-канал не является. Но входящие в элемент канала элементы расширения, которые не поддерживаются никаким стандартом (например, элементы расширения Dublin Core), доступны с помощью свойства SyndicationItem.ElementExtensions и отображаются, как показано в следующем примере кода.
//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
});
}