Compartilhar via


Como gerenciar entradas de feed da Web (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 acessar um documento de serviço e modificar os recursos de feed que ele contém usando o namespace Windows.Web.AtomPub, que é a implementação do Tempo de Execução do Windows do Protocolo Atom Publication.

Pré-requisitos

Os exemplos a seguir usam JavaScript e são baseados no exemplo de AtomPub. 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

1. Documentos de serviço

Antes de vermos o código de exemplo, é útil ter conhecimentos básicos sobre como os documentos de serviço são usados para definir a estrutura do conteúdo dos feeds de um serviço Web.

O documento de serviço encapsula pelo menos um elemento de espaço de trabalho, que representa um ou mais conjuntos. Em outras palavras, as publicações na Web como blogs pessoais e páginas são considerados espaços de trabalho, e os conjuntos contidos representam feeds individuais, cada um com um número de entradas.

A sintaxe a seguir é um breve exemplo de um documento de serviço.

<?xml version="1.0" encoding='utf-8'?>
<service xmlns="http://www.w3.org/2007/app"
         xmlns:atom="http://www.w3.org/2005/Atom">
    <workspace>
        <atom:title>Main Site</atom:title>
        <collection
            href="http://example.org/blog/main" >
            <atom:title>My Blog Entries</atom:title>
            <categories
               href="http://example.com/cats/forMain.cats" />
        </collection>
        <collection
            href="http://example.org/blog/pic" >
            <atom:title>Pictures</atom:title>
            <accept>image/png</accept>
            <accept>image/jpeg</accept>
            <accept>image/gif</accept>
        </collection>
    </workspace>
</service>

Para recuperar um documento de serviço, passe o Uri associado para o retrieveServiceDocumentAsync. Para recuperar, editar ou excluir entradas específicas de feed, um aplicativo precisará analisar um ServiceDocument recuperado para os URIs absolutos associados a entradas individuais.

2. Inicializando o cliente com credenciais de autenticação

Os exemplos a seguir utilizam as classes no namespace Windows.Web.AtomPub para operações de gerenciamento de feed e as classes no namespace Windows.Web.Syndication para representar elementos de feed individuais. Além disso, a maioria dos serviços de publicação da Web exigirão alguma forma de autenticação, uma funcionalidade fornecida pelo namespace Windows.Security.

O exemplo a seguir demonstra como definir credenciais e incluí-las na inicialização de uma instância do AtomPubClient.


//define some variables

// The default values for the site.
var baseUri = "http://<Your Wordpress Site>.wordpress.com/";
var user = "";
var password = "";

// The default Service Document and Edit 'URIs'
var editUri = "./wp-app.php/posts";
var serviceDocUri = "./wp-app.php/service";
var feedUri = "./?feed=atom";
var currentFeed = null;
var currentItemIndex = 0;
        
var client;

var item;

// Get current credentialS and create the AtomPub client
function createClient() {
    client = new Windows.Web.AtomPub.AtomPubClient();
    // Don't save the results to the client's cache
    client.bypassCacheOnRetrieve = true;

    if ((user !== "") && (password !== "")) {
        var credential = new Windows.Security.Credentials.PasswordCredential();
        credential.userName = user;
        credential.password = password;
        client.serverCredential = credential;
    }
    else {
        client.serverCredential = null;
    }
}

3. Criando uma nova publicação em uma coleta

Uma nova publicação pode ser adicionada a uma coleta existente, criando um novo objeto SyndicationItem e preenchendo-o com o conteúdo desejado. Quando o SyndicationItem estiver pronto, passe o objeto, uma cadeia de caracteres curta que descreve a entrada e o feed Uri para o método createResourceAsync no AtomPubClient.

O construtor Uri lança uma exceção se o uriString passado para o construtor não for um URI válido. Portanto, validamos o uriString usando um bloco try/catch.

É 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 createResourceAsync 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 exemplo usa uma função onError para capturar quaisquer exceções e imprime mais informações detalhadas sobre a exceção, se ocorrer um erro.

// Called when an async function generates an error.
function onError(err) {
    displayError(err);

    // Match error number with a WebErrorStatus value, in order to deal
    // with a specific error.
    var errorStatus = Windows.Web.WebError.getStatus(err.number);
    if (errorStatus === Windows.Web.WebErrorStatus.unauthorized) {
        displayLog("Wrong username or password!");
    }
}

function createPost (uriString, postTitle, postContent, postSummary, postAuthor) {

    var resourceUri;
    try {
        resourceUri = new Windows.Foundation.Uri(uriString);
    } catch (error) {
        displayLog("Error: Invalid URI");
    return;

    var syndicationItem;

    item = new Windows.Web.Syndication.SyndicationItem();
    item.title = new Windows.Web.Syndication.SyndicationText(postTitle);
    item.summary = new Windows.Web.Syndication.SyndicationText(postSummary);
    item.content = new Windows.Web.Syndication.SyndicationContent(postContent, Windows.Web.Syndication.SyndicationTextType.Text);
    item.authors[0] = new Windows.Web.Syndication.SyndicationPerson(postAuthor);
    // Note: Also other item fields can be set such as 'syndicationItem.Categories[0]'

    return client.createResourceAsync(resourceUri, item.title.text, item);
}).done(function (result) {
    if (result) {
        displayLog("Posted at " + result.editUri.displayUri);
        displayLog("New post created.");
    }
 }, onError);

4. Editando uma publicação em uma coleta

Para editar uma entrada existente em uma coleta, passe o Uri associado para o método retrieveFeedAsync no SyndicationClient. Prepare um SyndicationItem com novos valores e passe o objeto para updateResourceAsync no AtomPubClient juntamente com o Uri usado para recuperar a entrada.

function editPost (uriString, postTitle, postContent, postSummary, postAuthor) {

    var resourceUri;
    try {
        resourceUri = new Windows.Foundation.Uri(uriString);
    } catch (error) {
        displayLog("Error: Invalid URI");
    return;

    var updatedItem = new Windows.Web.Syndication.SyndicationItem();
    updatedItem.title = new Windows.Web.Syndication.SyndicationText(postTitle);
    updatedItem.summary = new Windows.Web.Syndication.SyndicationText(postSummary);
    updatedItem.content = new Windows.Web.Syndication.SyndicationContent(postContent, Windows.Web.Syndication.SyndicationTextType.Text);
    updatedItem.authors[0] = new Windows.Web.Syndication.SyndicationPerson(postAuthor);
    // Note: Also other item fields can be set such as 'syndicationItem.Categories[0]'

    client.updateResourceAsync(resourceUri, updatedItem).done(function () {
        displayLog("Updating item completed.");
    }
 }, onError);
}

5. Excluindo uma publicação de uma coleta

Para excluir uma entrada de uma coleta, passe a propriedade editUri da instância SyndicationItem para o método deleteResourceItemAsync na instância AtomPubClient.

function deletePost(uriString, currentFeed) {

    var resourceUri;
    try {
        resourceUri = new Windows.Foundation.Uri(uriString);
    } catch (error) {
        displayLog("Error: Invalid URI");
    return;

   // If we retrieve the feed via the resourceUri then we will be logged in and will be
   // able to modify/delete the resource.

   client.retrieveFeedAsync(resourceUri).done(function (feed) {
       currentFeed = feed;
       currentItemIndex = 0;

       displayLog("Got feed");
       var title = "(no title)";
       if (currentFeed.title) {
           title = currentFeed.title.text;
       }
       displayLog("Title: " + title);

       var currentItem = getCurrentItem();
       if (currentItem) {
           displayLog("EditUri: " + currentItem.editUri);
       }

       displayStatus("Fetching feed completed.");
   }, onError);
    
   client.deleteResourceItemAsync(currentItem).done(function() {
       displayLog("Deleting item completed.");
    
       // Our feed is now out of date.  Re-fetch the feed before deleting something else.
       currentFeed = null;
    }, onError);
    }

Resumo e próximas etapas

Neste tópico recuperamos um documento de serviço, adicionamos novas entradas de coleta, modificamos entradas de coleta existente e excluímos entradas de coleta nesse documento. Para obter uma demonstração rápida da recuperação básica de feeds, veja Como acessar um web feed.

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 acessar um web feed

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

Referência

AtomPubClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Exemplos

Amostra de AtomPub

Exemplo de sindicalização