HTTP-Client in C#: Anfragen richtig und effizient stellen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum braucht man einen korrekten HTTP-Client in C#?

In der modernen Entwicklung kommt kaum eine Anwendung ohne die Interaktion mit externen Diensten aus. Ob es um das Senden von Daten an einen Server, das Abrufen von Wechselkursen oder die Arbeit mit einer Cloud-API geht – all dies erfordert eine korrekte Implementierung von HTTP-Anfragen. Im C# (.NET)-Ökosystem ist das Hauptwerkzeug für diese Aufgabe die Klasse HttpClient. Viele Entwickler, insbesondere Anfänger, machen jedoch typische Fehler: Sie erstellen für jede Anfrage eine neue Instanz von HttpClient, vergessen, Ausnahmen zu behandeln, oder arbeiten falsch mit Asynchronität.

In diesem Artikel werden wir uns ansehen, wie man einen HTTP-Client in C# richtig organisiert, das Senden von GET- und POST-Anfragen, die Arbeit mit Headern und dem Anfragetext sowie die besten Praktiken zur Fehlerbehandlung behandeln. Nach der Lektüre werden Sie in der Lage sein, zuverlässigen und leistungsfähigen Code für die Interaktion mit beliebigen REST-APIs zu schreiben.



Grundlagen der Arbeit mit HttpClient in C#

Die Klasse HttpClient befindet sich im Namensraum System.Net.Http und ist in allen modernen Versionen von .NET (Core, 5, 6, 7, 8 und höher) verfügbar. Ihr Hauptvorteil ist die Unterstützung asynchroner Operationen und die automatische Verwaltung des Verbindungspools.



Korrekte Erstellung von HttpClient

Wichtigste Regel: Erstellen Sie keinen neuen HttpClient für jede Anfrage. Dies kann zur Erschöpfung von Sockets (socket exhaustion) führen. Verwenden Sie stattdessen eine Instanz für die gesamte Lebensdauer der Anwendung oder nutzen Sie IHttpClientFactory.

// ❌ Schlecht: Neuer HttpClient für jede Anfrageusing (var client = new HttpClient()){    var response = await client.GetAsync("https://api.example.com");}

// ✅ Gut: Ein HttpClient für alle Anfragenpublic class MyHttpService{ private static readonly HttpClient _client = new HttpClient(); public async Task<string> GetDataAsync(string url) { return await _client.GetStringAsync(url); }}


Basiseinstellungen

Bei der Initialisierung von HttpClient können Sie eine Basisadresse, Timeouts und Standard-Header festlegen:

public class ApiClient{    private readonly HttpClient _httpClient;        public ApiClient()    {        _httpClient = new HttpClient        {            BaseAddress = new Uri("https://api.pythonlib.ru/"),            Timeout = TimeSpan.FromSeconds(10)        };                // Header, die mit jeder Anfrage gesendet werden        _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");        _httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");    }}


Senden von GET- und POST-Anfragen

Betrachten wir die beiden häufigsten Arten von HTTP-Anfragen: Daten abrufen (GET) und Daten senden (POST).



GET-Anfrage: Daten abrufen

Eine GET-Anfrage wird verwendet, um Daten vom Server zu lesen. Sie sollte den Zustand der Ressource nicht ändern und enthält keinen Textkörper.

public async Task<string> GetUserAsync(int userId){    try    {        var response = await _httpClient.GetAsync($"/api/users/{userId}");        response.EnsureSuccessStatusCode(); // Wirft eine Ausnahme bei einem Fehler        return await response.Content.ReadAsStringAsync();    }    catch (HttpRequestException ex)    {        Console.WriteLine($"Anfragefehler: {ex.Message}");        throw;    }}

Für einfache Fälle kann die Kurzform verwendet werden:

string json = await _httpClient.GetStringAsync("/api/users/42");


POST-Anfrage: Daten senden

Eine POST-Anfrage wird verwendet, um neue Ressourcen zu erstellen. Die Daten werden im Anfragetext übermittelt, meist im JSON-Format.

public async Task<User> CreateUserAsync(User newUser){    // Serialisieren des Objekts in JSON    var json = JsonSerializer.Serialize(newUser);   

Blogs

Buchempfehlungen