Programování

Kdy použít WebClient vs. HttpClient vs. HttpWebRequest

Máte tři různé možnosti, jak při práci v .NET Framework konzumovat REST API: WebClient, HttpClient a HttpWebRequest. V tomto příspěvku se podíváme na tyto tři způsoby, jak můžeme přistupovat k rozhraním REST API v rámci spravovaného prostředí, tj. Bez použití knihoven třetích stran. V následujících částech ilustruji tyto přístupy pomocí příslušných příkladů kódu, které vám pomohou lépe porozumět konceptům.

Stručně řečeno, WebRequest - ve své implementaci specifické pro HTTP HttpWebRequest - představuje původní způsob, jak využívat požadavky HTTP v .NET Framework. WebClient poskytuje jednoduchý, ale omezený obal kolem HttpWebRequest. A HttpClient je nový a vylepšený způsob provádění požadavků a příspěvků HTTP, který dorazil s .NET Framework 4.5.

Začněme naši diskusi s abstraktní třídou WebRequest.

System.Net.WebRequest

Třída System.Net.WebRequest je abstraktní třída. Budete tedy muset vytvořit HttpWebRequest nebo FileWebRequest, abyste pomocí této třídy spotřebovali požadavky HTTP. Následující fragment kódu ukazuje, jak můžete pracovat s WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

WebRequest byla první třídou poskytovanou v .NET Framework, která spotřebovávala požadavky HTTP. Poskytuje vám velkou flexibilitu při zpracování každého aspektu objektu požadavku a odpovědi, aniž byste blokovali vlákno uživatelského rozhraní. Tuto třídu můžete použít k přístupu a práci s hlavičkami, soubory cookie, protokoly a časovými limity při práci s HTTP. Následující fragment kódu ukazuje, jak lze použít HttpWebRequest.

HttpWebRequest http = HttpWebRequest) WebRequest.Create („// localhost: 8900 / api / default“);

WebResponse response = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = nový StreamReader (memoryStream);

string data = streamReader.ReadToEnd ();

Dokumentaci společnosti Microsoft k HttpWebRequest najdete zde.

System.Net.WebClient

Třída System.Net.WebClient v .NET poskytuje na HttpWebRequest abstrakci na vysoké úrovni. WebClient je pouze obal kolem HttpWebRequest, takže používá HttpWebRequest interně. WebClient je tedy ve srovnání s HttpWebRequest trochu pomalý, ale vyžaduje, abyste psali mnohem méně kódu. WebClient můžete použít pro jednoduché způsoby připojení a práce se službami HTTP. Je to obecně lepší volba než HttpWebRequest, pokud nepotřebujete využít další funkce, které HttpWebRequest poskytuje. Následující fragment kódu ukazuje, jak můžete pracovat s WebClientem.

string data = null;

pomocí (var webClient = nový WebClient ())

{

data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient byl představen v .NET Framework 4.5. Pro vývojáře používající .NET 4.5 nebo novější je to upřednostňovaný způsob, jak využívat požadavky HTTP, pokud nemáte konkrétní důvod jej nepoužívat. V podstatě HttpClient kombinuje flexibilitu HttpWebRequest a jednoduchost WebClient a poskytuje vám to nejlepší z obou světů.

Třída HttpWebRequest poskytuje velkou kontrolu nad objektem požadavku / odpovědi. Měli byste si však být vědomi toho, že HttpClient nikdy nebyl navržen jako náhrada za WebClient. Měli byste použít HttpWebRequest místo HttpClient, kdykoli potřebujete další funkce, které HttpWebRequest poskytuje. Dále, na rozdíl od WebClienta, HttpClient postrádá podporu pro hlášení průběhu a vlastní schémata URI.

Ačkoli HttpClient nepodporuje FTP, zesměšňování a testování HttpClient je jednodušší. Všechny I / O vázané metody v HttpClient jsou asynchronní a můžete použít stejnou instanci HttpClient také pro souběžné požadavky. Následující fragment kódu ukazuje, jak můžete pracovat s HttpClient.

veřejná asynchronní úloha GetAuthorsAsync (řetězec URI)

{

Autor autor = null;

HttpResponseMessage response = await client.GetAsync (uri);

if (response.IsSuccessStatusCode)

    {

autor = čekat na odpověď.Content.ReadAsAsync ();

    }

návratový autor;

}

Všimněte si, že když dojde k chybě v odpovědi, HttpClient chybu nevyhodí. Spíše stanoví IsSuccessStatusCode vlastnost na hodnotu false. Pokud chcete vyvolat výjimku, pokud IsSuccessStatusCode vlastnost je nepravdivá, můžete zavolat na EnsureSuccessStatusCode metoda na instanci odpovědi, jak je uvedeno níže.

response.EnsureSuccessStatusCode ();

HttpClient byl navržen tak, aby byl vytvořen jednou instancí a znovu použit během celého životního cyklu aplikace - neměli byste vytvářet novou instanci HttpClient pro každý požadavek, který vaše aplikace potřebuje zpracovat. Pokud tak učiníte, dostupné zásuvky by se mohly vyčerpat silným provozem, což by vedlo kSocketException chyby. Doporučeným postupem je vytvořit jednu sdílenou instanci HttpClient.

$config[zx-auto] not found$config[zx-overlay] not found