Поделиться через


Как получить доступ к веб-каналу (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

В этом разделе рассказывается, как извлечь и отобразить веб-канал при помощи классов в пространстве имен Windows.Web.Syndication в приложении среды выполнения Windows.

Необходимые условия

В следующих примерах, основанных на примере Syndication, используется JavaScript. Общую справку по созданию приложения среды выполнения Windows на JavaScript см. в разделе о создании первого приложения среды выполнения Windows на JavaScript. Для завершения асинхронных операций в этом разделе также используются объекты Promise в JavaScript. Подробнее об этой технике программирования см. в разделе об асинхронном программировании на JavaScript с использованием объектов Promise.

Чтобы подготовить приложение среды выполнения Windows для работы в сети, необходимо настроить соответствующие возможности сетевого подключения в файле проекта Package.appxmanifest. Если приложению нужно подключаться в качестве клиента к удаленным службам в Интернете, для этого требуется возможность Интернет (клиент). Если же нужно подключаться в качестве клиента к удаленным службам в домашней или рабочей сети, требуется возможность Домашняя/рабочая сеть. Подробнее: Как настроить возможности сети.

Инструкции

Получение сводного содержимого из веб-канала

Теперь рассмотрим код, в котором демонстрируется способ извлечения канала и отображения каждого из его отдельных элементов. Прежде чем настроить и отправить запрос, определим несколько переменных для этой операции, а затем инициализируем экземпляр SyndicationClient, определяющий методы и свойства, предназначенные для извлечения и отображения канала.

Конструктор Uri создает исключение, если параметр uriString, переданный конструктору, не является допустимым URI. Поэтому проверяем uriString при помощи блока Try/Catch.

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 передается в функцию retrieveFeedAsync для запроса канала.

Допустим, было возвращено нужное содержимое канала, в этом случае код перебирает каждый элемент канала, вызывая displayCurrentItem (который мы определим позже), чтобы отобразить элементы и их содержимое в виде списка посредством пользовательского интерфейса.

При вызове большинства асинхронных сетевых методов вам нужно создать код для обработки исключений. Обработчик исключений может получить подробную информацию о причине исключения, чтобы разобраться в проблеме и принять необходимые меры. Подробнее см. в разделе об обработке исключений в сетевых приложениях.

Метод retrieveFeedAsync создает исключение, если не удается установить подключение к HTTP-серверу или объект Uri не указывает на действительный элемент AtomPub или RSS-канал. Код примера использует функцию onError для перехвата исключений и вывода более подробной информации об исключении в случае ошибки.

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

В предыдущем шаге метод retrieveFeedAsync вернул запрошенное содержимое канала, а код примера перебрал все доступные элементы канала. Каждый из этих элементов представляется с помощью объекта SyndicationItem, содержащего все свойства элемента и содержимое, которое предоставляется соответствующим стандартом синдикации (RSS или Atom). В следующем примере рассматривается функция displayCurrentItem, которая обрабатывает каждый элемент и отображает его содержимое посредством элементов пользовательского интерфейса с различными именами.

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

Как упоминалось выше, содержимое, представленное объектом SyndicationItem, будет различаться в зависимости от того, какой стандарт (RSS или Atom) используется для публикации веб-канала. Например, веб-канал Atom может предоставлять список contributors, а RSS-канал — нет. Однако входящие в элемент канала элементы расширения, которые не поддерживаются никаким стандартом (например, элементы расширения Dublin Core), могут быть доступны с помощью свойства SyndicationItem.elementExtensions и отображены, как показано в следующем примере кода:


    // 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

    });
}

Краткая сводка и дальнейшие действия

В данном разделе мы получили веб-канал, связанный с предоставленным URI, и поэлементно показали содержимое веб-канала.

Более подробную информацию о дополнительных возможностях, таких как добавление, изменение и удаление записей, см. в статье Управление записями веб-канала.

Связанные разделы

Прочие ссылки

Асинхронное программирование на JavaScript с использованием объектов Promise

Как настроить возможности сети

Обработка исключений в сетевых приложениях

Управление записями веб-канала

Схема создания приложений среды выполнения Windows на JavaScript

Ссылки

SyndicationClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Примеры

Пример AtomPub

Пример Syndication