Linguaggio: HTML | XAML

Connessione con richieste HTTP XML e IXMLHTTPRequest2 (app di Windows Runtime in C++ e XAML)

Applies to Windows and Windows Phone

Usa la richiesta estesa HTTP XML e l'interfaccia IXMLHTTPRequest2 per inviare richieste GET e POST HTTP a un servizio Web che usa C++ in un'app di Windows Runtime.L'esempio di richiesta GET HTTP XML 2 e l'esempio di richiesta POST HTTP XML 2 illustrano le funzionalità presentate in questo argomento.

Nota  Per eseguire richieste HTTP in un'app di Windows Runtime sviluppata con C#, Visual Basic o C++, vedi Connessione a un server HTTP tramite Windows.Web.Http.HttpClient.

IXMLHTTPRequest2 consente alle applicazioni di essere eseguite in un apartment a thread multipli (MTA), un requisito per l'esecuzione in Windows Runtime in Windows 8. L'esecuzione in un MTA significa che un thread che ha accesso a un oggetto IXMLHTTPRequest2 non blocca l'elaborazione delle richieste o delle risposte per altri oggetti IXMLHTTPRequest2 in esecuzione nello stesso apartment.

Questa interfaccia implementa anche un modello di callback per la gestione di eventi. Poiché i metodi IXMLHTTPRequest2 consentono solo le chiamate di metodi asincroni, per ricevere i callback di completamento un'applicazione deve passare un puntatore a un oggetto IXMLHTTPRequest2Callback quando questo chiama IXMLHTTPRequest2::Open per creare una richiesta HTTP.

Per avere nozioni di base sui modelli di richieste HTTP, vedi la RFC 2616.

Prerequisiti

Gli esempi seguenti usano C++ e sono basati sull'esempio di richiesta GET HTTP XML 2 e sull'esempio di richiesta POST HTTP XML 2. Per informazioni generali sulla creazione di un'app di Windows Runtime in C++, vedi Creare la prima app di Windows Runtime in C++.

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. Per altre informazioni, vedi Come impostare le funzionalità di rete.

Impostare le funzionalità per abilitare l'accesso in rete

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

    La funzionalità Internet (client) è necessaria se l'app deve essere in grado di connettersi come client a servizi Web in Internet. La funzionalità Reti private (client e server) è necessaria se l'app deve essere in grado di connettersi come client a servizi Web in una rete domestica o aziendale.

    Nota  In Windows Phone, c'è solo una funzionalità di rete (Internet (client e server)) che consente l'accesso a tutte le reti per l'app.

    Se un'app vuole accedere al servizio Web in esecuzione nello stesso computer dell'app, è necessario l'accesso loopback. A un'app non viene solitamente consentito l'accesso loopback per motivi di sicurezza. Le app sviluppate ed eseguite in Microsoft Visual Studio 2013, tuttavia, verranno registrate automaticamente come esenti dalle restrizioni loopback durante l'esecuzione nel debugger. 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 isolamento della 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.

Creare e inviare una richiesta GET

  1. Crea innanzitutto i riferimenti necessari per questa operazione e il callback che indica il completamento della richiesta. L'esempio di richiesta GET HTTP XML 2 definisce le specifiche implementazioni di IXMLHTTPRequest2 e IXMLHTTPRequest2Callback, che vengono usate nella creazione degli oggetti operativi necessari negli esempi seguenti.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    
    
  2. Crea e inizializza istanze degli oggetti IXMLHTTPRequest2 e IXMLHTTPRequest2Callback.

    
    
    //
    // Create and initialize an IXMLHTTPRequest2 object
    //
    hr = CoCreateInstance(CLSID_FreeThreadedXMLHTTP60,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_PPV_ARGS(&spXHR));
    
    //
    //Create and initialize an IXMLHTTPRequest2Callback object
    //
    hr = MakeAndInitialize<CXMLHttpRequest2Callback>(&spXhrCallback);
    
    
    
  3. Configura la richiesta GET e inviala al server.

    
    
    hr = spXHR->Open(L"GET",              // Method.
                     pcwszUrl,            // Url.
                     spXhrCallback.Get(), // Callback.
                     NULL,                // Username.
                     NULL,                // Password.
                     NULL,                // Proxy username.
                     NULL);               // Proxy password.
    
    //
    //Send the GET request
    //
    hr = spXHR->Send(NULL, 0);
    
    
    
  4. Attendi il completamento della richiesta.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    
    
    

    Nota  I chiamanti che devono ricevere eventi di completamento o di stato in un thread STA o UI devono usare un meccanismo che non blocchi la distribuzione dei messaggi finestra dei thread, ad esempio inviando un messaggio finestra all'handle della finestra del thread STA o del thread UI.

Creare e inviare una richiesta POST

  1. Analogamente all'esempio GET, crea innanzitutto i riferimenti necessari per questa operazione e il callback che indica il completamento della richiesta. L'esempio di richiesta POST HTTP XML 2 definisce le specifiche implementazioni di IXMLHTTPRequest2 e IXMLHTTPRequest2Callback, che vengono usate nella creazione degli oggetti operativi necessari negli esempi seguenti. Per l'operazione POST tuttavia dovremo creare il flusso usato dall'operazione mediante XMLHttpRequest2PostStream, un'implementazione necessaria se ISequentialStream è definito per l'esempio. In alternativa, anziché usare ISequentialStream per una richiesta POST, includi SHCreateMemStream/SHCreateStreamOnFile per le app desktop e CreateStreamOverRandomAccessStream per le app di Windows Runtime.

    Crea innanzitutto i riferimenti necessari per questa operazione e il callback che indica l'avanzamento della richiesta. Abbiamo inoltre creato e definito le variabili usate per rappresentare le dimensioni del file da inviare e indicare il completamento della richiesta.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    ULONGLONG ullFileSize = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    ComPtr<CXMLHttpRequestPostStream> spXhrPostStream;
    
    
  2. Crea e inizializza gli oggetti delle classi IID_IXMLHTTPRequest2, CXMLHTTPRequest2Callback e XMLHTTPRequestPostStream.

    
    //
    //Initialize IXMLHTTPRequest2Callback
    //
    hr = MakeAndInitialize<CXMLHttpRequest2Callback>(&spXhrCallback);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    //
    // Create an object of the CXMLHttpRequestPostStream class
    //
    spXhrPostStream = Make<CXMLHttpRequestPostStream>();
    if (spXhrPostStream == NULL)
    {
        hr = E_OUTOFMEMORY;
        goto Exit;
    }
    
    
  3. Apri il file e ottieni la dimensione.

    
    //
    //Open the file
    //
    hr = spXhrPostStream->Open(pcwszFileName);
    
    //
    //Get file size
    //
    hr = spXhrPostStream->GetSize(&ullFileSize);
    
    
    
  4. Prepara la richiesta POST e inviala al server.

    
    //
    //Configure the POST request
    //
    hr = spXHR->Open(L"POST",             // Method.
                     pcwszUrl,            // Url.
                     spXhrCallback.Get(), // Callback.
                     NULL,                // Username.
                     NULL,                // Password.
                     NULL,                // Proxy username.
                     NULL);               // Proxy password.
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    //
    //Send the POST request
    //
    hr = spXHR->Send(spXhrPostStream.Get(), ullFileSize);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    
  5. Attendi il completamento della richiesta.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    fAbort = FALSE;
    
    

    Nota  I chiamanti che devono ricevere eventi di completamento o di stato in un thread STA o UI devono usare un meccanismo che non blocchi la distribuzione dei messaggi finestra dei thread, ad esempio inviando un messaggio finestra all'handle della finestra del thread STA o del thread UI.

Riepilogo

In questo argomento abbiamo esaminato come avviare una connessione a un servizio Web con le richieste GET POST usando la richiesta estesa HTTP XML e le interfacce IXMLHTTPRequest2 e IXMLHTTPRequest2Callback.

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
Riferimento
Richiesta estesa HTTP XML
IXMLHTTPRequest2
IXMLHTTPRequest2Callback
Richiesta estesa HTTP XML (IXMLHTTPRequest2)
Esempi
Esempio di richiesta GET HTTP XML 2
Esempio di richiesta POST HTTP XML 2

 

 

Mostra:
© 2014 Microsoft