Condividi tramite


Come accedere a un 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 recuperare e visualizzare un feed Web tramite le classi nello spazio dei nomiWindows.Web.Syndication nella tua app di Windows Runtime.

Prerequisiti

Gli esempi seguenti usano JavaScript e sono basati sull'esempio di diffusione. 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.

Istruzioni

Recupero di un contenuto diffuso da un feed Web

Ora esamineremo il codice che dimostra come recuperare un feed, per poi visualizzare ogni singolo elemento in esso contenuto. Prima di poter configurare e inviare la richiesta, definiremo alcune variabili che useremo durante l'operazione e inizializzeremo un'istanza di SyndicationClient, che definisce i metodi e le proprietà che useremo per recuperare e visualizzare il feed.

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.

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

Configuriamo poi la richiesta impostando le credenziali del server (proprietà serverCredential), le credenziali del proxy (proprietà proxyCredential) e le intestazioni HTTP (metodo setRequestHeader) necessarie. Con i parametri di base della richiesta configurati viene creato un oggetto Uri valido tramite una stringa URI del feed fornita dall'app. L'oggetto Uri viene poi passato alla funzione retrieveFeedAsync per richiedere il feed.

Presupponendo che il contenuto desiderato del feed venga restituito, il codice esegue un'iterazione tra tutti gli elementi del feed, chiamando displayCurrentItem (che definiremo più avanti) per visualizzare gli elementi e il relativo contenuto come un elenco tramite l'interfaccia utente.

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 retrieveFeedAsync 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.

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

Nel passaggio precedente retrieveFeedAsync restituisce il contenuto del feed richiesto e il codice di esempio inizia un'iterazione tra gli elementi del feed disponibili. Ognuno di questi elementi è rappresentato mediante un oggetto SyndicationItem che contiene tutte le proprietà dell'elemento e il contenuto concesso dallo standard di diffusione pertinente (RSS o Atom). Nell'esempio seguente osserveremo la funzione displayCurrentItem che esamina ogni elemento e nel visualizza il contenuto tramite vari elementi dell'interfaccia utente denominati.

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

Come indicato in precedenza, il contenuto rappresentato da un oggetto SyndicationItem varierà a seconda dello standard del feed (RSS o Atom) impiegato per pubblicare il feed. Un feed Atom, ad esempio, può fornire un elenco di contributors, mentre un feed RSS non può. È tuttavia possibile accedere agli elementi di estensione inclusi in un elemento del feed che non sono supportati da alcuno standard (ad esempio gli elementi di estensione Dublin Core) tramite la proprietà SyndicationItem.elementExtensions e quindi visualizzati come dimostrato nel seguente esempio di codice:


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

    });
}

Riepilogo e passaggi successivi

In questo argomento abbiamo recuperato un feed associato a un URI fornito e abbiamo visualizzato il contenuto del feed elemento per elemento.

Per informazioni sulle funzionalità più avanzate, come l'aggiunta, la modifica e l'eliminazione di voci da un feed Web, vedi Come gestire le voci dei feed Web.

Argomenti correlati

Altro

Programmazione asincrona in JavaScript con le promesse

Come impostare le funzionalità di rete

Come gestire le eccezioni nelle app di rete

Come gestire le voci dei feed Web

Roadmap per app di Windows Runtime scritte in JavaScript

Riferimento

SyndicationClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Esempi

Esempio di AtomPub

Esempio di diffusione