Como acessar um web feed (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Este tópico mostra como recuperar e exibir um feed da Web usando classes no namespace Windows.Web.Syndication em seu aplicativo de Tempo de Execução do Windows.

Pré-requisitos

Os exemplos a seguir usam JavaScript e são baseados no exemplo de sindicalização. Para obter instruções sobre a criação de um aplicativo do Tempo de Execução do Windows usando JavaScript, veja Criar o primeiro aplicativo de Tempo de Execução do Windows usando JavaScript. Além disso, as promessas de JavaScript são usadas neste tópico para concluir as operações assíncronas. Para obter mais informações sobre esse padrão de programação, consulte Programação assíncrona em JavaScript usando promessas.

Para garantir que o aplicativo do Tempo de Execução do Windows esteja pronto para a rede, defina alguns recursos de rede no arquivo Package.appxmanifest do projeto. Se o aplicativo precisa ser capaz de se conectar como um cliente aos serviços remotos na Internet, a capacidade de Internet (Cliente) é necessária. Se o aplicativo precisa ser capaz de se conectar como cliente aos serviços remotos na rede doméstica ou na rede comercial, então a capacidade Rede Doméstica/Comercial é necessária. Para obter mais informações, consulte Como definir recursos de rede.

Instruções

Recuperando um conteúdo sindicalizado de um web feed

Agora iremos revisar alguns códigos que demonstram como recuperar um feed e, depois, exibir cada item individual que o feed contém. Antes de configurar e enviar a solicitação, iremos definir algumas variáveis que usaremos durante a operação, e inicializar uma instância de SyndicationClient, que define os métodos e propriedades que usaremos para recuperar e exibir o feed.

O construtor Uri lança uma exceção se o uriString passado para o construtor não for uma URI válida. Portanto, validamos o uriString usando um bloco 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;
}

Em seguida, configuraremos a solicitação definindo as credenciais do Servidor (a propriedade serverCredential), as credenciais do proxy (a propriedade proxyCredential) e os cabeçalhos HTTP (o método setRequestHeader) necessários. Com os parâmetros de solicitação básicos configurados, um objeto Uri válido, criado usando uma cadeia de caracteres URI do feed fornecida pelo aplicativo. O objeto Uri é então passado para a função retrieveFeedAsync para solicitar o feed.

Pressupondo que o conteúdo de feed desejado foi retornado, o código itera cada item do feed, chamando displayCurrentItem (que definiremos em seguida), para exibir itens e seu conteúdo como uma lista na IU.

É necessário escrever um código para tratar exceções quando você chama a maioria dos métodos de rede assíncronos. Seu manipulador de exceção recupera informações mais detalhadas sobre a causa da exceção para entender melhor a falha e tomar as medidas adequadas. Para saber mais, veja Como manipular exceções em aplicativos de rede.

O método retrieveFeedAsync lança uma exceção se uma conexão não puder ser estabelecida com o servidor HTTP ou o objeto Uri não indicar para um AtomPub ou RSS feed válido. O código de amostra usa uma função onError para capturar quaisquer exceções e imprime mais informações detalhadas sobre a exceção, se ocorrer um erro.

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

Na etapa anterior, retrieveFeedAsync retornou o conteúdo de feed solicitado e o código de exemplo teve que trabalhar iterando através dos itens de feed disponíveis. Cada um desses itens é representado através de um objeto SyndicationItem que contém todas as propriedades e conteúdo do item suportado pelo padrão de sindicalização relevante (RSS ou Atom). No exemplo a seguir, observamos a função displayCurrentItem trabalhando em cada item e exibindo seu conteúdo através de vários elementos de IU indicados.

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

Como sugerido anteriormente, o tipo de conteúdo representado por um objeto SyndicationItem diferirá dependendo do padrão de feed (RSS ou Atom) empregado para publicar o feed. Por exemplo, um feed Atom é capaz de fornecer uma lista de contributors, mas um feed RSS não é. No entanto, elementos de extensão incluídos em um feed que não são aceitos por nenhum padrão (por exemplo, elementos de extensão Dublin Core) podem ser acessados com a propriedade SyndicationItem.elementExtensions e, depois, exibidos como demonstrado no seguinte exemplo de código:


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

    });
}

Resumo e próximas etapas

Neste tópico, recuperamos um feed associado a um URI fornecido e exibimos o conteúdo do feed item a item.

Para obter recursos mais avançados como a habilidade de adicionar, editar e excluir entradas dentro de um web feed, consulte Como gerenciar entradas de de feed da Web.

Tópicos relacionados

Outro

Programação assíncrona em JavaScript com promessas

Como definir recursos de rede

Como resolver exceções em aplicativos de rede

Como gerenciar entradas de feed

Mapa para os aplicativos do Tempo de Execução do Windows usando JavaScript

Referência

SyndicationClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Exemplos

Amostra de AtomPub

Exemplo de sindicalização