Come stabilire una connessione a server HTTP tramite Windows.Web.Http (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 ]

Inviare una richiesta GET a un servizio Web e recuperare la risposta utilizzando la classe Windows.Web.Http.HttpClient nello spazio dei nomi Windows.Web.Http.

[Accedi all'esempio HTTPClient ora.]

Le classi nello spazio dei nomi Windows.Web.Http offrono un'interfaccia di programmazione per le app client HTTP moderne. Lo spazio dei nomi Windows.Web.Http e gli spazi dei nomi correlati Windows.Web.Http.Headers e Windows.Web.Http.Filters forniscono componenti client HTTP che consentono agli utenti di eseguire richieste HTTP e ricevere risposte HTTP da servizi Web moderni tramite HTTP.

Windows 8.1 introduce Windows.Web.Http, lo spazio dei nomi di Windows Runtime che usi per le app Windows che si connettono a HTTP e a servizi Web REST (Representational State Transfer). Questa nuova API offre un supporto completo delle funzionalità per tutti i linguaggi supportati e sostituisce l'API HTTP rilasciata in origine per Windows 8.

La nuova API sostituisce tre diverse API con funzionalità diverse precedentemente necessarie per ogni proiezione di linguaggio in Windows 8.

Per le operazioni di richiesta di base, la nuova API prevede una semplice interfaccia per gestire le attività più comuni e offre impostazioni predefinite sensate per l'autenticazione (AUTH) applicabili alla maggior parte degli scenari. Per le operazioni HTTP più complesse sono disponibili funzionalità aggiuntive, tra le quali:

  • Metodi per i verbi comuni (DELETE, GET, PUT e POST)

  • Supporto di impostazioni e schemi di autenticazione comuni

  • Accesso ai dettagli SSL (Secure Sockets Layer) sul trasporto

  • Possibilità di includere filtri personalizzati nelle app avanzate

  • Possibilità di recuperare, impostare ed eliminare cookie

  • Info sullo stato delle richieste HTTP disponibili per i metodi asincroni

La classe Windows.Web.Http.HttpClient viene usata per inviare e ricevere richieste di base tramite HTTP. Fornisce la classe principale per inviare richieste HTTP e ricevere risposte HTTP da una risorsa identificata da un URI. Questa classe può essere usata per inviare richieste GET, PUT, POST, DELETE e di altro tipo a un servizio Web. Ognuna di queste richieste viene inviata in modo asincrono.

La classe Windows.Web.Http.HttpRequestMessage rappresenta un messaggio di richiesta HTTP inviato da Windows.Web.Http.HttpClient. La classe Windows.Web.Http.HttpResponseMessage rappresenta un messaggio di risposta HTTP ricevuto da una richiesta HTTP. I messaggi HTTP sono definiti nella RFC 2616 da IETF.

Lo spazio dei nomi Windows.Web.Http include varie classi diverse che rappresentano il contenuto HTTP (intestazioni per il contenuto e il corpo dell'entità HTTP, cookie inclusi) associato a una richiesta HTTP o a una risposta HTTP. Queste diverse classi consentono al contenuto di usare un buffer, una stringa, un flusso, oltre ai dati nome/valore codificati con il tipo MIME application/x-www-form-urlencoded, il tipo MIME multipart/* e il tipo MIME multipart/form-data. È possibile definire anche contenuto personalizzato.

In questo esempio, la classe HttpStringContent viene usata per rappresentare la risposta HTTP come stringa.

Lo spazio dei nomi Windows.Web.Http.Headers supporta la creazione di intestazioni HTTP e cookie, che vengono poi associati come proprietà a oggetti HttpRequestMessage e HttpResponseMessage.

Prerequisiti

Gli esempi seguenti in questo argomento sono scritti in JavaScript e HTML. È necessaria una conoscenza di base delle richieste HTTP descritte nella RFC 2616.

È anche possibile effettuare richieste HTTP in un'app scritta in JavaScript e HTML usando WinJS.xhr e XMLHttpRequest. Per altre informazioni, vedi Connessione a un servizio Web (app di Windows Runtime scritte in JavaScript e HTML).

Istruzioni

Passaggio 1: Creare un nuovo progetto

  1. Apri Microsoft Visual Studio 2013 e scegli Nuovo progetto dal menu File.
  2. Nell'elenco dei modelli scegli JavaScript.
  3. In questa sezione scegli Store apps.
  4. In questa sezione seleziona Universal Apps, Windows apps o Windows Phone apps (in base alla piattaforma di destinazione), e quindi seleziona Applicazione vuota.
  5. Assegna all'applicazione il nome HttpClientGet e fai clic su OK.

Passaggio 2: Impostare le funzionalità per abilitare l'accesso in rete

Per consentire alla tua app di accedere a una rete privata domestica o aziendale e a Internet, devi impostare le funzionalità di rete. Per questa app devi abilitare le funzionalità di rete in quanto il client si connette a servizi Web.

Le app che usano Windows.Web.Http.HttpClient per connettersi a un servizio Web su un computer diverso richiedono l'impostazione delle funzionalità di rete. Se l'app deve essere in grado di connettersi come client a servizi Web in Internet, è necessaria la funzionalità Internet (client). Se l'app deve essere in grado di connettersi come client a servizi Web su una rete di casa o di lavoro, è necessaria la funzionalità Reti private (client e server).

Nota  In Windows Phone è disponibile un'unica funzionalità di rete (Internet (client e server) che consente l'accesso completo alla rete per l'app.

 

Se il servizio Web è in esecuzione nello stesso computer dell'app, sarà necessario l'accesso loopback. Le app sviluppate ed eseguite in Visual Studio 2013 verranno registrate automaticamente come esenti dalle restrizioni loopback. Per altre informazioni, vedi Come abilitare il loopback ed eseguire il debug dell'isolamento di rete.

Per altre informazioni sull'accesso di rete, vedi Come configurare le funzionalità di rete.

Questi passaggi sono necessari per impostare le funzionalità di rete per un'app prima che venga distribuita, in caso di accesso a un servizio Web su Internet o a una rete privata o aziendale.

  1. Usa Visual Studio 2013 per aprire il file package.appxmanifest.

  2. Seleziona la scheda Funzionalità.

  3. Per sviluppare la versione di Windows dell'esempio, seleziona le funzionalità Internet (client) e Reti private (client e server).

    Per sviluppare la versione di Windows Phone dell'esempio, seleziona la funzionalità Internet (client e server).

  4. Salva e chiudi il file manifesto.

Passaggio 3: Aggiungi l'interfaccia utente HTML

  • In questa sezione definiremo il layout dell'app in HTML per specificare le dimensioni e la posizione approssimative di ogni oggetto nell'app. L'interfaccia utente per l'app verrà completata con l'aggiunta di controlli e contenuto per la visualizzazione dei dati.

    Questo esempio usa semplici elementi di interfaccia utente HTML, inclusi i seguenti:

    • Un controllo con class usato per un'etichetta di testo e il campo di input per l'indirizzo URI di input e un controllo button usato per avviare la richiesta asincrona.

    • Un controllo con un class con un'etichetta di testo e un campo di testo per visualizzare lo stato corrente. Questa è la posizione in cui verranno visualizzati i messaggi di stato e di errore. Questo controllo contiene anche un elemento class per la visualizzazione dell'output ricevuto dal servizio Web. In questo esempio, il risultato dell'operazione HTTP GET è visualizzato come testo normale che contiene il markup HTML.

    Apri la cartella js e apri il file default.js esistente, quindi aggiungi gli elementi di interfaccia utente seguenti a questo file.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>HttpClientGet</title>
    
        <!-- WinJS references - Windows -->
        <link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
        <script src="//Microsoft.WinJS.2.0/js/base.js"></script>
        <script src="//Microsoft.WinJS.2.0/js/ui.js"></script>
    
        <!-- WinJS references - Phone -->
        <link href="/css/ui-themed.css" rel="stylesheet" />
        <script src="//Microsoft.Phone.WinJS.2.1/js/base.js"></script>
        <script src="//Microsoft.Phone.WinJS.2.1/js/ui.js"></script>
    
        <!-- HttpClientGet references -->
        <link href="/css/default.css" rel="stylesheet" />
        <script src="/js/default.js"></script>
        <script src="/js/mainpage.js"></script>
    </head>
    
    <body>
        <div data-win-control="SampleInput">
            <p> Download the contents of a page and display it. </p>
            <p class="clear">
                <label for="inputAddress">URI Address:</label>
                <input type="text" id="inputAddress" value="https://www.contoso.com" />
            </p>
            <p>
                <button id="startButton">Start</button>
            </p>
        </div>
        <div data-win-control="SampleOutput">
            <p class="clear">
                <label for="statusText">Status:</label>
                <input type="text" id="statusText" value="" />
            </p>
            <textarea id="outputView"></textarea>
        </div>
    </body>
    </html>
    

Passaggio 4: Creare HttpClient

  • Crea prima di tutto l'oggetto Windows.Web.Http.HttpClient e aggiungi un'intestazione user-agent.

    Per impostazione predefinita, l'oggetto HttpClient non invia alcuna intestazione user-agent con la richiesta HTTP al servizio Web. Alcuni server HTTP, inclusi alcuni server Web Microsoft, richiedono che un'intestazione user-agent sia inclusa con la richiesta HTTP inviata dal client. Il server HTTP restituisce un errore se l'intestazione non è presente. Dobbiamo aggiungere un'intestazione user-agent tramite le classi nello spazio dei nomi Windows.Web.Http.Headers. Aggiungiamo questa intestazione alla proprietà HttpClient.DefaultRequestHeaders per evitare questi errori.

    Apri la cartella js e aggiungi un nuovo file mainpage.js, quindi aggiungi il codice seguente al file.

    (function () {
        "use strict";
    
        var httpClient;
        var httpPromise;
    
        var page = WinJS.UI.Pages.define("/html/mainpage.html", {
            ready: function (element, options) {
                document.getElementById("startButton").addEventListener("click", start, false);
    
                httpClient = new Windows.Web.Http.HttpClient();
    
                // Add a user-agent header
                headers = httpClient.defaultRequestHeaders;
    
                // UserAgent is a HttpProductInfoHeaderValueCollection
                // A collection of HttpProductInfoHeaderValue items
    
                // The safe way to check a header value from the user is the TryParseAdd method
                // Since we know this header is okay, we use ParseAdd with will throw an exception
                // with a bad value 
    
                headers.userAgent.parseAdd("ie");
                headers.userAgent.parseAdd("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
            }
        });
    })();
    

    Apri la cartella js e il file default.js, quindi aggiungi il codice seguente al file.

    (// For an introduction to the Blank template, see the following documentation:
    // https://go.microsoft.com/fwlink/p/?LinkID=232509
    (function () {
        "use strict";
    
        var app = WinJS.Application;
        var activation = Windows.ApplicationModel.Activation;
    
        app.onactivated = function (args) {
            if (args.detail.kind === activation.ActivationKind.launch) {
                if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                    startButton.onclick = start;
    
                } else {
                    startButton.onclick = start;
                }
                args.setPromise(WinJS.UI.processAll());
            }
        };
    
        app.oncheckpoint = function (args) {
            // This application is about to be suspended. Save any state
            // that needs to persist across suspensions here. You might use the
            // WinJS.Application.sessionState object, which is automatically
            // saved and restored across suspension. If you need to complete an
            // asynchronous operation before your application is suspended, call
            // args.setPromise().
        };
    
        app.start();
    })();
    

Passaggio 5: Inviare la richiesta GET e ricevere la risposta

  • Al clic sul pulsante Start verifichiamo innanzitutto che l'URI specificato in inputAddress sia valido. Inviamo quindi la richiesta GET tramite l'URI e aspettiamo di ricevere la risposta dal server HTTP.

    La maggior parte del lavoro viene svolta nel gestore del clic per il controllo Button Start. Quando questo pulsante riceve il clic, viene aggiornato il testo degli elementi dell'interfaccia utente statusText e outputView. Viene prima di tutto controllato l'indirizzo URI per verificare che l'utente abbia passato un indirizzo URI valido. Se l'URI è valido, l'app invia la richiesta GET HTTP all'URI specificato e attende la risposta HTTP. Se si verifica un errore o un'eccezione, il risultato viene visualizzato nell'elemento dell'interfaccia utente statusText. Se non si verificano errori, la risposta proveniente dal servizio Web viene visualizzata nell'elemento dell'interfaccia utente outputView.

    Viene generata un'eccezione in caso di passaggio di una stringa non valida per l'URI (Uniform Resource Identifier) al costruttore per l'oggetto Windows.Foundation.Uri.

    In JavaScript non esiste alcun metodo per analizzare una stringa ed estrarne l'URI. Per intercettare l'eccezione in questo caso, usa un blocco try/catch per racchiudere il codice di costruzione dell'URI.

    L'esempio controlla inoltre che lo schema HTTP nell'URI sia HTTP o HTTPS, dato che questi sono gli unici schemi supportati da Windows.Web.Http.HttpClient.

    Con le parole chiave then e done in JavaScript, il codice per l'invio della richiesta GET e il recupero della risposta in modo asincrono è simile a quello che dovremmo usare per eseguire l'operazione in modo sincrono.

    Le eccezioni dovute a errori di rete (ad esempio perdita di connettività, errori di connessione e problemi di server e HTTP) possono verificarsi in qualsiasi momento. Questi errori causano la generazione di eccezioni. Se non vengono gestite dall'app, le eccezioni possono causare la chiusura improvvisa dell'intera app da parte del runtime. Per le chiamate della maggior parte dei metodi di rete asincroni devi quindi scrivere codice per gestire le eccezioni. Quando si verifica un'eccezione, è possibile riprovare a eseguire il metodo di rete per tentare di risolvere il problema. In altri casi, si può prevedere che l'app continui a funzionare senza connessione di rete usando i dati precedentemente memorizzati nella cache. Per altre informazioni sulla gestione delle eccezioni di rete, vedi Gestione di eccezioni nelle app di rete.

    Il metodo HttpResponse.EnsureSuccessStatusCode genera un'eccezione se il server Web restituisce un codice di stato di errore HTTP, un codice HttpResponse.StatusCode non compreso nell'intervallo Successful (200-299) per la richiesta. Usiamo un blocco try/catch per qualsiasi eccezione e stampiamo il messaggio dell'eccezione nell'elemento statusText dell'interfaccia utente se si verifica un errore.

    La proprietà HttpResponse.Content rappresenta il contenuto della risposta HTTP. Il metodo HttpClient.GetAsync(Uri) legge il contenuto HTTP in una stringa come operazione asincrona. Sostituiamo gli eventuali tag <br> nel testo HTML restituito con nuove righe per una visualizzazione ottimale. Se il metodo ha esito positivo, visualizziamo il codice HttpResponse.StatusCode nell'elemento di interfaccia utente statusText e il contenuto HttpResponse.Content restituito dal servizio Web nell'elemento dell'interfaccia utente outputView.

    Apri la cartella js e aggiungi il codice seguente al file mainpage.js.

        function start()
        {
    
            var response = new Windows.Web.Http.HttpResponseMessage();
    
            var statusText = document.getElementById("statusText");
            var outputView = document.getElementById("outputView");
    
            // The value of 'inputAddress' is set by the user 
            // and is therefore untrusted input. 
            // If we can't create a valid absolute URI, 
            // We notify the user about the incorrect input.
    
            statusText.Text = "Testing URI is valid.";
    
            var uriString = document.getElementById("inputAddress").value.trim();
            if (!uriString) {
                return;
            }
    
            var resourceUri;
            try {
               resourceUri = new Windows.Foundation.Uri(uriString);
            }
            catch (Exception) {
                statusText.Text = "Invalid URI, please re-enter a valid URI.";
                return;
            }
    
            if (resourceUri.schemeName != "http" && resourceUri.schemeName != "https") {
                statusText.Text = "Only 'http' and 'https' schemes supported. Please re-enter URI";
                return;
            }
    
            var responseBodyAsText="";
            outputView.Text = "";
            statusText.Text = "Waiting for response ...";
    
            httpPromise = httpClient.getAsync(resourceUri).then(function (response) {
                outputStatus = response.statusCode + " " + response.reasonPhrase;
    
                response.EnsureSuccessStatusCode();
    
                response.content.readAsStringAsync().then(function (responseBodyAsText) {
                // Format the HTTP response to display better
                responseBodyAsText = responseBodyAsText.replace(/<br>/g, "\r\n");
                outputView.value = responseBodyAsText;
                return response;
            });
        )};
    
        httpPromise.done(function (response) {
            statusText.value = response.StatusCode + " " + response.ReasonPhrase + "\r\n";
        }, onError);
    
        function onError(error) {
            statusText.value = "Error = " + error.number + "  Message: " + error.message;
        }
    
    })();
    

    Windows.Web.Http.HttpClient usa WinInet per inviare richieste HTTP e di servizi Web e per la ricezione delle risposte. Il valore di timeout predefinito usato da WinInet per un'operazione di connessione HTTP è di 60 secondi. Se un server HTTP o un servizio Web è temporaneamente inattivo o bloccato da un firewall e il server non risponde o non può rispondere alla richiesta Windows.Web.Http.HttpClient, WinInet attende i 60 secondi predefiniti prima di restituire un errore che causa la generazione di un'eccezione nell'app. Se la query per ottenere il nome di un server HTTP restituisce più indirizzi IP per il nome, WinInet prova un certo numero di altri indirizzi IP per il sito, ognuno con un timeout predefinito di 60 secondi prima di generare errore. Un'app che effettua una richiesta HTTP o di servizio Web potrebbe attendere vari minuti durante i tentativi con più indirizzi IP, prima che WinInet restituisca un errore e venga generata un'eccezione. Questo comportamento potrebbe essere interpretato dall'utente come interruzione dell'app. Il timeout predefinito usato da WinInet per le operazioni di invio e ricezione dopo l'attivazione di una connessione è di 30 secondi.

    Per fare in modo che l'app sia più reattiva e ridurre al minimo questi problemi, si potrebbe ottimizzare un'app impostando un timeout più breve per le operazioni Windows.Web.Http.HttpClient, in modo che l'esito negativo allo scadere del timeout avvenga prima rispetto alle impostazioni predefinite di WinInet. Per altre informazioni su come impostare un timeout, vedi Impostazione di valori di timeout con WinJS.xhr o HttpClient e Come impostare i timeout nelle operazioni socket.

Osservazioni

In questo argomento abbiamo esaminato come usare la classe Windows.Web.Http.HttpClient per inviare una richiesta GET a un servizio Web e recuperare la risposta usando le classi Windows.Web.Http.HttpResponseMessage e le classi correlate nello spazio dei nomi Windows.Web.Http.Headers.

Argomenti correlati

Altre risorse

Connessione a servizi Web

Gestione di eccezioni nelle app di rete

Come configurare le funzionalità di rete

Come abilitare il loopback ed eseguire il debug dell'isolamento di rete

Impostazione di valori di timeout con WinJS.xhr o HttpClient

Riferimenti

Windows.Foundation.Uri

Windows.Web.Http

Windows.Web.Http.Filters

Windows.Web.Http.Headers

Esempi

Esempio di HttpClient

Esempio di autenticazione Web