Compartir a través de


Cómo administrar entradas de fuentes web (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

En este tema se muestra cómo acceder a un documento de servicio y modificar los recursos de las fuentes que contiene mediante el espacio de nombres Windows.Web.AtomPub, que es la implementación del protocolo de publicación Atom de Windows en tiempo de ejecución.

Requisitos previos

Los siguientes ejemplos usan JavaScript y se basan en la muestra de AtomPub. Para obtener ayuda sobre cómo crear una aplicación de Windows en tiempo de ejecución con JavaScript, consulta Crear la primera aplicación de Windows en tiempo de ejecución con JavaScript. De forma adicional, en este tema se usan promesas de JavaScript para completar las operaciones asincrónicas. Si quieres obtener más información acerca de este patrón de programación, consulta el tema sobre programación asincrónica en JavaScript con compromisos.

Para asegurarte de que la aplicación de Windows en tiempo de ejecución está lista para la red, debes establecer las funcionalidades necesarias en el archivo Package.appxmanifest del proyecto. Si la aplicación debe conectarse a servicios remotos de Internet como cliente, se necesitará la funcionalidad Internet (cliente). Si la aplicación debe conectarse a servicios remotos de una red doméstica o del trabajo como cliente, se necesitará la funcionalidad Redes domésticas o de trabajo. Para obtener más información, consulta Cómo establecer las funcionalidades de red.

Instrucciones

1. Documentos de servicio

Antes de revisar el código de ejemplo, sería conveniente tener un conocimiento básico sobre el uso de documentos de servicio para definir la estructura del contenido de fuentes para un servicio web.

Un documento de servicio encapsula al menos un elemento del área de trabajo, que representa una o varias colecciones. En otras palabras, las publicaciones web, como los blogs y las páginas web personales, son consideradas áreas de trabajo, y las colecciones incluidas en estas áreas representan fuentes individuales; cada una con un número de entradas.

La siguiente sintaxis es un ejemplo breve de un documento de servicio:

<?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 un documento de servicio, pasa el Uri asociado a retrieveServiceDocumentAsync. Para recuperar, editar o eliminar entradas de fuentes específicas, la aplicación debe analizar un ServiceDocument recuperado para los URI absolutos asociados con las entradas individuales.

2. Inicialización del cliente con credenciales de autenticación

En los ejemplos siguientes se usan clases del espacio de nombres Windows.Web.AtomPub para las operaciones de administración de fuentes y clases en el espacio de nombres Windows.Web.Syndication para representar elementos de fuentes individuales. Además, la mayoría de los servicios de publicación web requieren algún tipo de autenticación, funcionalidades proporcionadas por el espacio de nombres Windows.Security.

En el siguiente ejemplo se muestra cómo configurar credenciales e incluirlas en la inicialización de una instancia de 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. Creación de una entrada nueva en una colección

Se puede agregar una entrada nueva a una colección existente. Para ello, crea un objeto SyndicationItem nuevo y rellénalo con el contenido que quieras. Cuando el SyndicationItem esté listo, pasa el objeto, una cadena breve que describa la entrada y el Uri de la fuente para el método createResourceAsyncde AtomPubClient.

El constructor Uri inicia una excepción si la uriString que se pasó al constructor no es un URI válido. Así que validamos la uriString mediante un bloque try/catch.

Debes escribir código para controlar las excepciones cuando llamas a la mayoría de los métodos de red asincrónicos. Tu controlador de excepciones puede recuperar información más detallada sobre la causa de la excepción para comprender mejor el error y tomar las decisiones adecuadas. Para obtener más información, consulta Cómo controlar excepciones en aplicaciones de red.

El método createResourceAsync inicia una excepción si no se puede establecer una conexión con el servidor HTTP o si el objeto Uri no señala a una fuente AtomPub o RSS válida. El código de ejemplo usa una función onError para capturar las excepciones e imprimir información más detallada sobre la excepción, si se produce un error.

// 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. Edición de una entrada en una colección

Para editar una entrada existente en una colección, pasa el Uri asociado al método retrieveFeedAsyncde SyndicationClient. Prepara un SyndicationItem con valores nuevos y pasa el objeto a updateResourceAsync en el AtomPubClient junto con el Uri que usaste para recuperar la 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. Eliminación de una entrada de una colección

Para eliminar una entrada de una colección, pasa la propiedad editUri desde la instancia SyndicationItem a el método deleteResourceItemAsync de la instancia 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);
    }

Resumen y siguientes pasos

En este tema, hemos recuperado un documento de servicio, agregado nuevas entradas de colección, modificado entradas de colección ya existentes y eliminado entradas de colección dentro del documento. Para obtener una demo rápida de una recuperación de fuentes básica, consulta Cómo acceder a una fuente web.

Temas relacionados

Otros

Programación asincrónica en JavaScript con compromisos

Cómo establecer las funcionalidades de red

Cómo controlar excepciones en aplicaciones de red

Cómo acceder a una fuente web

Guía básica para crear aplicaciones de Windows en tiempo de ejecución con JavaScript

Referencia

AtomPubClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Muestras

Muestra de AtomPub

Muestra de redifusión web