Come gestire le voci dei feed Web (HTML)
[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]
Questo argomento illustra come accedere a un documento di servizio e modificare le risorse feed che contiene mediante lo spazio dei nomi Windows.Web.AtomPub, che è l'implementazione Windows Runtime del protocollo di pubblicazione Atom.
Gli esempi seguenti usano JavaScript e sono basati sull'Esempio di AtomPub. Per informazioni generali sulla creazione di un'app di Windows Runtime in JavaScript, vedi Creare la prima app di Windows Runtime in JavaScript. Inoltre, in questo argomento si usano promesse JavaScript per eseguire operazioni asincrone. Per altre informazioni su questo modello di programmazione, vedi Programmazione asincrona in JavaScript con promesse.
Per predisporre la tua app di Windows Runtime per l'uso in rete, devi impostare le eventuali funzionalità di rete necessarie nel file Package.appxmanifest del progetto. Se la tua app deve connettersi come client a servizi remoti su Internet, è necessaria la funzionalità Internet (client). Se l'app deve connettersi come client a servizi remoti su una rete domestica o aziendale, è necessaria la funzionalità Rete casa/lavoro. Per altre informazioni, vedi Come impostare le funzionalità di rete.
Prima di esaminare il codice di esempio, è utile acquisire una conoscenza di base sull'uso dei documenti di servizio per definire la struttura del contenuto dei feed di un dato servizio Web.
I documenti di servizio incapsulano almeno un elemento spazio di lavoro che rappresenta una o più raccolte. In altre parole, le pubblicazioni sul Web, come i blog personali e le pagine Web, sono considerate spazi di lavoro e le raccolte che contengono rappresentano singoli feed, ognuno contenente un certo numero di voci.
La sintassi seguente è un breve esempio di un documento di servizio:
<?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>
Per recuperare un documento di servizio, passa l'Uri associato a retrieveServiceDocumentAsync. Per recuperare, modificare o eliminare voci di feed specifiche, un'app deve analizzare un ServiceDocument recuperato per individuare gli URI assoluti associati alle singole voci.
Gli esempi seguenti usano le classi nello spazio dei nomi Windows.Web.AtomPub per le operazioni di gestione del feed e le classi nello spazio dei nomi Windows.Web.Syndication per rappresentare i singoli elementi del feed. Inoltre, la maggior parte dei servizi di pubblicazione sul Web richiede una qualche forma di autenticazione, funzionalità fornite dallo spazio dei nomi Windows.Security.
L'esempio seguente illustra come impostare le credenziali e includerle nell'inizializzazione di un'istanza di 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;
}
}
Puoi aggiungere un nuovo post a una raccolta esistente creando un nuovo oggetto SyndicationItem e popolandolo con il contenuto desiderato. Quando SyndicationItem è pronto, passa l'oggetto, una breve stringa che descrive la voce e il feed Uri al metodo createResourceAsync in AtomPubClient.
Il costruttore Uri genera un'eccezione se la stringa uriString passata al costruttore non è un URL valido. Per questo motivo convalidiamo la stringa uriString con un blocco try/catch.
Per le chiamate della maggior parte dei metodi di rete asincroni devi quindi scrivere codice per gestire le eccezioni. Il gestore delle eccezioni può recuperare ulteriori dettagli sulla causa in modo da comprendere meglio l'errore e prendere le decisioni appropriate. Per ulteriori informazioni, vedi Come gestire le eccezioni nelle app di rete.
Il metodo createResourceAsync genera un'eccezione se non è possibile stabilire una connessione con il server HTTP oppure se l'oggetto Uri non punta a un feed AtomPub o RSS valido. Il codice di esempio usa una funzione onError per intercettare eventuali eccezioni e stampare altre informazioni dettagliate sull'eccezione, se si verifica un errore.
// 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);
Per modificare una voce esistente in una raccolta, passa l'Uri associato al metodo retrieveFeedAsync in SyndicationClient. Prepara un SyndicationItem con i nuovi valori e passa l'oggetto a updateResourceAsync in AtomPubClient insieme all'elemento Uri usato per recuperare la voce.
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);
}
Per eliminare una voce da una raccolta, passa la proprietà editUri dall'istanza SyndicationItem al metodo deleteResourceItemAsync nell'istanza 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);
}
In questo argomento abbiamo recuperato un documento di servizio, aggiunto nuove voci a una raccolta, modificato le voci esistenti della raccolta ed eliminato voci della raccolta in tale documento. Per una dimostrazione rapida delle operazioni di recupero dei feed di base, vedi Come accedere a un feed Web.
Altro
Programmazione asincrona in JavaScript con le promesse
Come impostare le funzionalità di rete
Come gestire le eccezioni nelle app di rete
Roadmap per app di Windows Runtime scritte in JavaScript
Riferimento
Esempi