Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Belangrijke API's
Gebruik HttpClient en de rest van de Windows. Web.Http-naamruimte-API voor het verzenden en ontvangen van informatie met behulp van de PROTOCOLLEN HTTP 2.0 en HTTP 1.1.
Tip
WinUI 3-apps die gericht zijn op .NET 6 of hoger, kunnen ook System.Net.Http.HttpClient gebruiken (de .NET HttpClient). Het ondersteunt IHttpClientFactory, annuleringstokens en moderne asynchrone patronen. Gebruik Windows.Web.Http.HttpClient deze functie wanneer u WinRT-specifieke functies nodig hebt, zoals referentieprompts, cookiebeheer via de WinRT-broker of integratie met Windows netwerkisolatie. Voor eenvoudige HTTP-aanvragen in een .NET WinUI 3-app is System.Net.Http.HttpClient het vaak eenvoudiger.
Overzicht van HttpClient en de Windows. Web.Http-naamruimte
De klassen in de Windows. Web.Http-naamruimte en de gerelateerde Windows. Web.Http.Headers en Windows. Web.Http.Filters-naamruimten bieden een programmeerinterface voor Windows-apps die fungeren als een HTTP-client om eenvoudige GET-aanvragen uit te voeren of meer geavanceerde HTTP-functionaliteit te implementeren die hieronder wordt vermeld.
Methoden voor veelgebruikte werkwoorden (DELETE, GET, PUT en POST). Elk van deze aanvragen wordt verzonden als een asynchrone bewerking.
Ondersteuning voor algemene verificatie-instellingen en -patronen.
Toegang tot SSL-gegevens (Secure Sockets Layer) over het transport.
Mogelijkheid om aangepaste filters op te nemen in geavanceerde apps.
Mogelijkheid om cookies te verkrijgen, in te stellen en te verwijderen.
Informatie over de voortgang van HTTP-aanvragen die beschikbaar zijn op asynchrone methoden.
De Windows. Web.Http.HttpRequestMessage-klasse vertegenwoordigt een HTTP-aanvraagbericht dat is verzonden door Windows. Web.Http.HttpClient. De Windows. Web.Http.HttpResponseMessage-klasse vertegenwoordigt een HTTP-antwoordbericht dat is ontvangen van een HTTP-aanvraag. HTTP-berichten worden gedefinieerd in RFC 2616 door de IETF.
De Windows. Web.Http-naamruimte vertegenwoordigt HTTP-inhoud als de hoofdtekst en headers van de HTTP-entiteit, inclusief cookies. HTTP-inhoud kan worden gekoppeld aan een HTTP-aanvraag of een HTTP-antwoord. De Windows. Web.Http-naamruimte biedt een aantal verschillende klassen die HTTP-inhoud vertegenwoordigen.
- HttpBufferContent. Inhoud als buffer
- HttpFormUrlEncodedContent. Inhoud als naam- en waardeparen, gecodeerd met het MIME-type application/x-www-form-urlencoded
- HttpMultipartContent. Inhoud in de vorm van het MIME-type met meerdere onderdelen/* .
- HttpMultipartFormDataContent. Inhoud die is gecodeerd als het MIME-type met meerdere onderdelen/formuliergegevens .
- HttpStreamContent. Inhoud als een stroom (het interne type wordt gebruikt door de HTTP GET-methode voor het ontvangen van gegevens en de HTTP POST-methode voor het uploaden van gegevens)
- HttpStringContent. Inhoud als een tekenreeks.
- IHttpContent - Een basisinterface voor ontwikkelaars om hun eigen inhoudsobjecten te maken
Het codefragment in de sectie 'Een eenvoudige GET-aanvraag verzenden via HTTP' gebruikt de klasse HttpStringContent om het HTTP-antwoord van een HTTP GET-aanvraag weer te geven als een tekenreeks.
De Windows. Web.Http.Headers-naamruimte ondersteunt het maken van HTTP-headers en cookies, die vervolgens worden gekoppeld als eigenschappen met httpRequestMessage- en HttpResponseMessage-objecten.
Een eenvoudige GET-aanvraag verzenden via HTTP
Zoals eerder vermeld in dit artikel, stelt de naamruimte Windows.Web.Http Windows-apps in staat om GET-aanvragen te verzenden. Het volgende codefragment laat zien hoe u een GET-aanvraag verzendt naar http://www.contoso.com het gebruik van de Windows. Web.Http.HttpClient-klasse en de Windows. Web.Http.HttpResponseMessage-klasse om het antwoord van de GET-aanvraag te lezen.
//Create an HTTP client object
Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();
//Add a user-agent header to the GET request.
var headers = httpClient.DefaultRequestHeaders;
//The safe way to add a header value is to use the TryParseAdd method and verify the return value is true,
//especially if the header value is coming from user input.
string header = "MyApp/1.0";
if (!headers.UserAgent.TryParseAdd(header))
{
throw new Exception("Invalid header value: " + header);
}
Uri requestUri = new Uri("http://www.contoso.com");
//Send the GET request asynchronously and retrieve the response as a string.
Windows.Web.Http.HttpResponseMessage httpResponse = new Windows.Web.Http.HttpResponseMessage();
string httpResponseBody = "";
try
{
//Send the GET request
httpResponse = await httpClient.GetAsync(requestUri);
httpResponse.EnsureSuccessStatusCode();
httpResponseBody = await httpResponse.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
httpResponseBody = "Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message;
}
// pch.h
#pragma once
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Web.Http.Headers.h>
// main.cpp : Defines the entry point for the console application.
#include "pch.h"
#include <iostream>
using namespace winrt;
using namespace Windows::Foundation;
int main()
{
init_apartment();
// Create an HttpClient object.
Windows::Web::Http::HttpClient httpClient;
// Add a user-agent header to the GET request.
auto headers{ httpClient.DefaultRequestHeaders() };
// The safe way to add a header value is to use the TryParseAdd method, and verify the return value is true.
// This is especially important if the header value is coming from user input.
std::wstring header{ L"MyApp/1.0" };
if (!headers.UserAgent().TryParseAdd(header))
{
throw L"Invalid header value: " + header;
}
Uri requestUri{ L"http://www.contoso.com" };
// Send the GET request asynchronously, and retrieve the response as a string.
Windows::Web::Http::HttpResponseMessage httpResponseMessage;
std::wstring httpResponseBody;
try
{
// Send the GET request.
httpResponseMessage = httpClient.GetAsync(requestUri).get();
httpResponseMessage.EnsureSuccessStatusCode();
httpResponseBody = httpResponseMessage.Content().ReadAsStringAsync().get();
}
catch (winrt::hresult_error const& ex)
{
httpResponseBody = ex.message();
}
std::wcout << httpResponseBody;
}
Binaire gegevens posten via HTTP
Het onderstaande voorbeeld van C++/WinRT-code illustreert het gebruik van formuliergegevens en een POST-aanvraag om een kleine hoeveelheid binaire gegevens te verzenden als een bestand dat naar een webserver wordt geüpload. De code gebruikt de klasse HttpBufferContent om de binaire gegevens weer te geven en de klasse HttpMultipartFormDataContent om de formuliergegevens met meerdere delen weer te geven.
Note
Het aanroepen van get (zoals in het onderstaande codevoorbeeld) is niet geschikt voor een UI-thread. Zie Gelijktijdigheid en asynchrone bewerkingen met C++/WinRT voor de juiste techniek die u in dat geval kunt gebruiken.
// pch.h
#pragma once
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Security.Cryptography.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Web.Http.Headers.h>
// main.cpp : Defines the entry point for the console application.
#include "pch.h"
#include <iostream>
#include <sstream>
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage::Streams;
int main()
{
init_apartment();
auto buffer{
Windows::Security::Cryptography::CryptographicBuffer::ConvertStringToBinary(
L"A sentence of text to encode into binary to serve as sample data.",
Windows::Security::Cryptography::BinaryStringEncoding::Utf8
)
};
Windows::Web::Http::HttpBufferContent binaryContent{ buffer };
// You can use the 'image/jpeg' content type to represent any binary data;
// it's not necessarily an image file.
binaryContent.Headers().Append(L"Content-Type", L"image/jpeg");
Windows::Web::Http::Headers::HttpContentDispositionHeaderValue disposition{ L"form-data" };
binaryContent.Headers().ContentDisposition(disposition);
// The 'name' directive contains the name of the form field representing the data.
disposition.Name(L"fileForUpload");
// Here, the 'filename' directive is used to indicate to the server a file name
// to use to save the uploaded data.
disposition.FileName(L"file.dat");
Windows::Web::Http::HttpMultipartFormDataContent postContent;
postContent.Add(binaryContent); // Add the binary data content as a part of the form data content.
// Send the POST request asynchronously, and retrieve the response as a string.
Windows::Web::Http::HttpResponseMessage httpResponseMessage;
std::wstring httpResponseBody;
try
{
// Send the POST request.
Uri requestUri{ L"https://www.contoso.com/post" };
Windows::Web::Http::HttpClient httpClient;
httpResponseMessage = httpClient.PostAsync(requestUri, postContent).get();
httpResponseMessage.EnsureSuccessStatusCode();
httpResponseBody = httpResponseMessage.Content().ReadAsStringAsync().get();
}
catch (winrt::hresult_error const& ex)
{
httpResponseBody = ex.message();
}
std::wcout << httpResponseBody;
}
Als u de inhoud van een daadwerkelijk binair bestand wilt posten (in plaats van de expliciete binaire gegevens die hierboven worden gebruikt), zult u het gemakkelijker vinden om een HttpStreamContent-object te gebruiken. Maak een en geef als argument aan de constructor de waarde door die wordt geretourneerd van een aanroep naar StorageFile.OpenReadAsync. Deze methode retourneert een stroom voor de gegevens in uw binaire bestand.
Als u een groot bestand uploadt (groter dan ongeveer 10 MB), raden we u ook aan de Windows Runtime API's voor achtergrondoverdracht te gebruiken.
POST JSON-gegevens via HTTP
In het volgende voorbeeld worden JSON-gegevens naar een eindpunt verzonden, waarna de inhoud van de respons wordt weergegeven.
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Web.Http;
private async Task TryPostJsonAsync()
{
try
{
// Construct the HttpClient and Uri. This endpoint is for test purposes only.
HttpClient httpClient = new HttpClient();
Uri uri = new Uri("https://www.contoso.com/post");
// Construct the JSON to post.
HttpStringContent content = new HttpStringContent(
"{ \"firstName\": \"Eliot\" }",
UnicodeEncoding.Utf8,
"application/json");
// Post the JSON and wait for a response.
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(
uri,
content);
// Make sure the post succeeded, and write out the response.
httpResponseMessage.EnsureSuccessStatusCode();
var httpResponseBody = await httpResponseMessage.Content.ReadAsStringAsync();
Debug.WriteLine(httpResponseBody);
}
catch (Exception ex)
{
// Write out any exceptions.
Debug.WriteLine(ex);
}
}
// pch.h
#pragma once
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Security.Cryptography.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Web.Http.Headers.h>
// main.cpp : Defines the entry point for the console application.
#include "pch.h"
#include <iostream>
#include <sstream>
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage::Streams;
int main()
{
init_apartment();
Windows::Web::Http::HttpResponseMessage httpResponseMessage;
std::wstring httpResponseBody;
try
{
// Construct the HttpClient and Uri. This endpoint is for test purposes only.
Windows::Web::Http::HttpClient httpClient;
Uri requestUri{ L"https://www.contoso.com/post" };
// Construct the JSON to post.
Windows::Web::Http::HttpStringContent jsonContent(
L"{ \"firstName\": \"Eliot\" }",
UnicodeEncoding::Utf8,
L"application/json");
// Post the JSON, and wait for a response.
httpResponseMessage = httpClient.PostAsync(
requestUri,
jsonContent).get();
// Make sure the post succeeded, and write out the response.
httpResponseMessage.EnsureSuccessStatusCode();
httpResponseBody = httpResponseMessage.Content().ReadAsStringAsync().get();
std::wcout << httpResponseBody.c_str();
}
catch (winrt::hresult_error const& ex)
{
std::wcout << ex.message().c_str();
}
}
Uitzonderingen in Windows. Web.Http
Er wordt een uitzondering gegenereerd wanneer een ongeldige tekenreeks voor een URI (Uniform Resource Identifier) wordt doorgegeven aan de constructor voor de Windows. Foundation.Uri-object.
.NET: De Windows.Foundation.Uri-type wordt in C# en VB weergegeven als System.Uri.
In C# en Visual Basic kan deze fout worden vermeden door de klasse System.Uri te gebruiken in de .NET 4.5 en een van de methoden System.Uri.TryCreate om de tekenreeks te testen die is ontvangen van een gebruiker voordat de URI wordt samengesteld.
In C++is er geen methode om een tekenreeks te parseren naar een URI. Als een app door de gebruiker opgegeven invoer ontvangt voor de Windows.Foundation.Uri, zou de constructor in een try/catch-blok moeten staan. Als er een uitzondering optreedt, kan de app de gebruiker op de hoogte stellen en een nieuwe hostnaam aanvragen.
De Windows. Web.Http heeft geen handige functie. Een app die HttpClient en andere klassen in deze naamruimte gebruikt, moet dus de HRESULT-waarde gebruiken.
In apps die C++/WinRT gebruiken, vertegenwoordigt de winrt::hresult_error-struct een uitzondering die is gegenereerd tijdens het uitvoeren van de app. De functie winrt::hresult_error::code retourneert de HRESULT die is toegewezen aan de specifieke uitzondering. De functie winrt::hresult_error::message retourneert de door het systeem geleverde tekenreeks die is gekoppeld aan de HRESULT-waarde . Zie Foutafhandeling met C++/WinRT voor meer informatie
Mogelijke HRESULT-waarden worden vermeld in het headerbestand Winerror.h . Uw app kan filteren op specifieke HRESULT-waarden om het app-gedrag te wijzigen, afhankelijk van de oorzaak van de uitzondering.
In apps die gebruikmaken van het .NET Framework 4.5 in C#, VB.NET, vertegenwoordigt system.exception een fout tijdens het uitvoeren van de app wanneer er een uitzondering optreedt. De eigenschap System.Exception.HResult retourneert de HRESULT die is toegewezen aan de specifieke uitzondering. De eigenschap System.Exception.Message retourneert het bericht dat de uitzondering beschrijft.
C++/CX is vervangen door C++/WinRT. Maar in apps die gebruikmaken van C++/CX, vertegenwoordigt platform ::uitzondering een fout tijdens het uitvoeren van de app wanneer er een uitzondering optreedt. De eigenschap Platform::Exception::HResult retourneert de HRESULT die is toegewezen aan de specifieke uitzondering. De eigenschap Platform::Exception::Message retourneert de door het systeem geleverde tekenreeks die is gekoppeld aan de HRESULT-waarde .
Voor de meeste parametervalidatiefouten is de geretourneerde HRESULTE_INVALIDARG. Voor sommige ongeldige methodeaanroepen is de geretourneerde HRESULTE_ILLEGAL_METHOD_CALL.
Windows developer