.NET-HILFE

C# HttpClient (Wie es für Entwickler funktioniert)

Veröffentlicht 23. Oktober 2024
Teilen Sie:

DieHttpClient-Klassedas zum .NET Framework gehörende Tool HTTP bietet Methoden zum Senden von HTTP-Anfragen und Empfangen von HTTP-Antworten von einer durch einen URI identifizierten Ressource. Es vereinfacht die Erstellung von HTTP-Anfragen, unabhängig davon, ob es sich um GET-, POST-, PUT- oder DELETE-Anfragen handelt. Dieser Leitfaden behandelt die grundlegende Verwendung von HttpClient in praktischen Szenarien und stellt dieIronPDF-Bibliothek.

Erstellen einer neuen HttpClient-Instanz

Die Klasse HttpClient wird zum Senden von HTTP-Anfragen verwendet. Sie können eine neue Instanz davon wie folgt erstellen:

using System;
using System.Net.Http;
class Program
{
    static async Task Main(string[] args)
    {
        using var client = new HttpClient(); //HttpClient client
        var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London"); // HTTP response for GET request
        var responseBody = await response.Content.ReadAsStringAsync(); // response content
        Console.WriteLine(responseBody);
    }
}
using System;
using System.Net.Http;
class Program
{
    static async Task Main(string[] args)
    {
        using var client = new HttpClient(); //HttpClient client
        var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London"); // HTTP response for GET request
        var responseBody = await response.Content.ReadAsStringAsync(); // response content
        Console.WriteLine(responseBody);
    }
}

In diesem Beispiel:

  • Eine neue HttpClient-Instanz wird erstellt mit var client = new HttpClient().
  • Eine HTTP-GET-Anfrage wird mit der Methode GetAsync gesendet.
  • Die HttpResponseMessage wird in var response gespeichert.
  • Der Inhalt der Antwort wird mit der Methode response.Content.ReadAsStringAsync().

Senden von HTTP-Anfragen

HTTP-GET-Anfrage

Eine HTTP-GET-Anfrage stellen und die Antwort bearbeiten:

var client = new HttpClient();
var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Paris");
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
var client = new HttpClient();
var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Paris");
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
  • Die Eigenschaft IsSuccessStatusCode stellt sicher, dass die Anfrage erfolgreich war.
  • Der Antwortkörper wird asynchron mit ReadAsStringAsync gelesen.

HTTP-POST-Anfrage

Das Senden einer POST-Anfrage beinhaltet das Hinzufügen eines Anfragekörpers:

var client = new HttpClient();
var requestBody = new StringContent("{ \"location\": \"New York\" }", Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.weatherapi.com/v1/forecast.json?key=YOUR_API_KEY", requestBody);
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
var client = new HttpClient();
var requestBody = new StringContent("{ \"location\": \"New York\" }", Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.weatherapi.com/v1/forecast.json?key=YOUR_API_KEY", requestBody);
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
  • PostAsync sendet die Anfrage mit dem angegebenen Body(requestBody).
  • Sie müssen den Inhaltstyp angeben(anwendung/JSON).

HTTP PUT-Anfrage

Eine HTTP PUT-Anfrage aktualisiert Ressourcen:

var client = new HttpClient();
var requestBody = new StringContent("{ \"location\": \"Tokyo\", \"days\": 3 }", Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://api.weatherapi.com/v1/forecast.json?key=YOUR_API_KEY", requestBody);
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
var client = new HttpClient();
var requestBody = new StringContent("{ \"location\": \"Tokyo\", \"days\": 3 }", Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://api.weatherapi.com/v1/forecast.json?key=YOUR_API_KEY", requestBody);
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
  • PutAsync sendet eine PUT-Anforderung, um die Ressource unter dem angegebenen URI zu aktualisieren.
  • Der Anfragetext enthält in der Regel die zu aktualisierenden Daten.

HTTP DELETE-Anfrage

So senden Sie eine HTTP-DELETE-Anfrage:

var client = new HttpClient();
var response = await client.DeleteAsync("https://api.weatherapi.com/v1/locations/1?key=YOUR_API_KEY");
if (response.IsSuccessStatusCode)
{
    Console.WriteLine("Resource deleted successfully");
}
var client = new HttpClient();
var response = await client.DeleteAsync("https://api.weatherapi.com/v1/locations/1?key=YOUR_API_KEY");
if (response.IsSuccessStatusCode)
{
    Console.WriteLine("Resource deleted successfully");
}
  • DeleteAsync sendet eine DELETE-Anforderung, um die Ressource zu entfernen.

Umgang mit HTTP-Antworten

Jede HTTP-Anfrage gibt ein HttpResponseMessage-Objekt zurück, das den Antwortkörper, die Kopfzeilen und den Statuscode enthält. Zum Beispiel:

var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Sydney");
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
else
{
    Console.WriteLine($"Error: {response.StatusCode}");
}
var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Sydney");
if (response.IsSuccessStatusCode)
{
    var responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
}
else
{
    Console.WriteLine($"Error: {response.StatusCode}");
}
  • Response.StatusCode liefert den Statuscode(z. B., 200, 404).
  • response.Content enthält den Antwortkörper, der asynchron mit ReadAsStringAsync gelesen werden kann.

Effiziente Nutzung von HttpClient

HttpClient-Instanzen sollten wiederverwendet werden, um das Connection Pooling zu nutzen und eine Erschöpfung der Systemressourcen zu vermeiden. Ein typisches Muster besteht darin, eine einzige HttpClient-Instanz für die gesamte Lebensdauer Ihrer Anwendung oder Ihres Dienstes zu erstellen. Dies kann über eine statische Variable oder über Dependency Injection für Webanwendungen erfolgen.

Statischer HttpClient Beispiel

public static class HttpClientProvider
{
    private static readonly HttpClient client = new HttpClient();
    public static HttpClient Client => client;
}
public static class HttpClientProvider
{
    private static readonly HttpClient client = new HttpClient();
    public static HttpClient Client => client;
}

Die HttpClient-Instanz wird in der gesamten Anwendung wiederverwendet, wodurch der Aufwand für die Erstellung neuer HTTP-Verbindungen reduziert wird.

Verwendung von HttpClient mit Dependency Injection

In einer Webanwendung wird empfohlen, den HttpClient als Singleton-Dienst zu registrieren:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
}

Sie können auch benannte Clients und typisierte Clients für spezifischere Konfigurationen erstellen.

Verbindungspooling und Proxy-Einstellungen

Durch die Wiederverwendung von HttpClient-Instanzen profitieren Sie vom Connection Pooling, das die Leistung mehrerer Anfragen an denselben Server verbessert. Sie können die Proxy-Einstellungen auch mit der Klasse HttpClientHandler konfigurieren:

var handler = new HttpClientHandler
{
    Proxy = new WebProxy("http://proxyserver:port"),
    UseProxy = true
};
var client = new HttpClient(handler);
var handler = new HttpClientHandler
{
    Proxy = new WebProxy("http://proxyserver:port"),
    UseProxy = true
};
var client = new HttpClient(handler);

Fehlerbehandlung und Status Codes

Um verschiedene HTTP-Statuscodes zu behandeln, überprüfen Sie die Eigenschaft HttpResponseMessage.StatusCode:

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
async Task MakeRequestAsync()
{
    try
    {
        using var client = new HttpClient();
        var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Berlin");
        // Response Status Code Cases
        switch (response.StatusCode)
        {
            case HttpStatusCode.OK:
                Console.WriteLine("Success");
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine($"Response content: {content}");
                break;
            case HttpStatusCode.NotFound:
                Console.WriteLine("Resource not found");
                break;
            case HttpStatusCode.Unauthorized:
                Console.WriteLine("Unauthorized access");
                break;
            case HttpStatusCode.InternalServerError:
                Console.WriteLine("Server error occurred");
                break;
            default:
                Console.WriteLine($"Unexpected status code: {response.StatusCode}");
                break;
        }
    }
    catch (HttpRequestException e)
    {
        Console.WriteLine($"Request error: {e.Message}");
    }
    catch (Exception e)
    {
        Console.WriteLine($"An error occurred: {e.Message}");
    }
}
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
async Task MakeRequestAsync()
{
    try
    {
        using var client = new HttpClient();
        var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=Berlin");
        // Response Status Code Cases
        switch (response.StatusCode)
        {
            case HttpStatusCode.OK:
                Console.WriteLine("Success");
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine($"Response content: {content}");
                break;
            case HttpStatusCode.NotFound:
                Console.WriteLine("Resource not found");
                break;
            case HttpStatusCode.Unauthorized:
                Console.WriteLine("Unauthorized access");
                break;
            case HttpStatusCode.InternalServerError:
                Console.WriteLine("Server error occurred");
                break;
            default:
                Console.WriteLine($"Unexpected status code: {response.StatusCode}");
                break;
        }
    }
    catch (HttpRequestException e)
    {
        Console.WriteLine($"Request error: {e.Message}");
    }
    catch (Exception e)
    {
        Console.WriteLine($"An error occurred: {e.Message}");
    }
}

Handhabung des JSON-Antwortkörpers

Sie arbeiten häufig mit JSON-Antworten. Sie können den Inhalt der Antwort in ein stark typisiertes Objekt deserialisieren:

using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
var client = new HttpClient();
var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London");
var jsonString = await response.Content.ReadAsStringAsync();
var weatherResponse = JsonSerializer.Deserialize<WeatherResponse>(jsonString);
public class WeatherResponse
{
    public string Location { get; set; }
    public double Temperature { get; set; }
}
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
var client = new HttpClient();
var response = await client.GetAsync("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London");
var jsonString = await response.Content.ReadAsStringAsync();
var weatherResponse = JsonSerializer.Deserialize<WeatherResponse>(jsonString);
public class WeatherResponse
{
    public string Location { get; set; }
    public double Temperature { get; set; }
}

Die Methode ReadAsStringAsync vereinfacht das Lesen von JSON-Inhalten direkt in C#-Objekte.

Einführung in IronPDF

C# HttpClient(Wie es für Entwickler funktioniert): Abbildung 1 - IronPDF

IronPDF ist eine .NET-PDF-Bibliothek, mit der PDF-Dateien in C# erstellt, bearbeitet und konvertiert werden können. Sie wird häufig verwendet fürgenerierung hochwertiger PDFs aus HTMLcSS, JavaScript und andere Formate. IronPDF bietet Funktionen wie die Konvertierung von HTML in PDF, das Zusammenführen von PDF-Dateien, das Anbringen von Wasserzeichen und sogar erweiterte Funktionen wie digitale Signaturen und PDF-Verschlüsselung. Sie ist mit verschiedenen Plattformen kompatibel, darunter Windows, Linux und macOS, und damit eine vielseitige Lösung für die plattformübergreifende Entwicklung.

Verwendung von IronPDF mit HttpClient

Die Kombination von IronPDF mit der HttpClient-Klasse in C# ist ein effektiver Weg, um PDF-Dokumente aus Webressourcen dynamisch zu erzeugen und zu bearbeiten. Sie können zum Beispiel HTML-Inhalte von einer URL über HttpClient abrufen und diese HTML-Inhalte dann mit IronPDF in ein PDF-Dokument konvertieren. Dies ist nützlich bei der Erstellung von Berichten, Rechnungen oder anderen Dokumenten, die dynamisch auf Live-Webinhalten basieren.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;
using IronPdf;
class Program
{
    static async Task Main(string[] args)
    {
        License.LicenseKey = "IRONSUITE.WINSWRITERSIRONSOFTWARECOM.31102-3E7C9B3308-CIHWVP2-L2A7FVEBUSFN-DP6CI32YVXIN-45HQSAZOBOCW-YCYETGS4ENQX-NZXXG4YCPAYI-EBCIJ43PNLJW-DKWC7U-TFXPQ4LKLXGPEA-DEPLOYMENT.TRIAL-G43TTA.TRIAL.EXPIRES.20.MAY.2025";
        using var client = new HttpClient();
        var response = await client.GetAsync("https://api.weatherapi.com/v1/forecast.json?key=55c9040a6ad34c6c90470702240609&q=London&days=3");
        if (response.IsSuccessStatusCode)
        {
            var jsonContent = await response.Content.ReadAsStringAsync();
            // Pretty-print the JSON
            var jsonElement = JsonSerializer.Deserialize<JsonElement>(jsonContent);
            var formattedJson = JsonSerializer.Serialize(jsonElement, new JsonSerializerOptions { WriteIndented = true });
            // Escape the JSON for HTML
            formattedJson = System.Web.HttpUtility.HtmlEncode(formattedJson);
            var htmlContent = $@"
            <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; }}
                    pre {{ background-color: #f4f4f4; padding: 20px; border-radius: 5px; white-space: pre-wrap; word-wrap: break-word; }}
                </style>
            </head>
            <body>
                <h1>Weather Forecast (JSON Data)</h1>
                <pre>{formattedJson}</pre>
            </body>
            </html>";
            var renderer = new ChromePdfRenderer();
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            pdf.SaveAs("F://weather_report.pdf");
            Console.WriteLine("PDF generated successfully!");
        }
        else
        {
            Console.WriteLine($"Failed to retrieve content. Status code: {response.StatusCode}");
        }
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;
using IronPdf;
class Program
{
    static async Task Main(string[] args)
    {
        License.LicenseKey = "IRONSUITE.WINSWRITERSIRONSOFTWARECOM.31102-3E7C9B3308-CIHWVP2-L2A7FVEBUSFN-DP6CI32YVXIN-45HQSAZOBOCW-YCYETGS4ENQX-NZXXG4YCPAYI-EBCIJ43PNLJW-DKWC7U-TFXPQ4LKLXGPEA-DEPLOYMENT.TRIAL-G43TTA.TRIAL.EXPIRES.20.MAY.2025";
        using var client = new HttpClient();
        var response = await client.GetAsync("https://api.weatherapi.com/v1/forecast.json?key=55c9040a6ad34c6c90470702240609&q=London&days=3");
        if (response.IsSuccessStatusCode)
        {
            var jsonContent = await response.Content.ReadAsStringAsync();
            // Pretty-print the JSON
            var jsonElement = JsonSerializer.Deserialize<JsonElement>(jsonContent);
            var formattedJson = JsonSerializer.Serialize(jsonElement, new JsonSerializerOptions { WriteIndented = true });
            // Escape the JSON for HTML
            formattedJson = System.Web.HttpUtility.HtmlEncode(formattedJson);
            var htmlContent = $@"
            <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; }}
                    pre {{ background-color: #f4f4f4; padding: 20px; border-radius: 5px; white-space: pre-wrap; word-wrap: break-word; }}
                </style>
            </head>
            <body>
                <h1>Weather Forecast (JSON Data)</h1>
                <pre>{formattedJson}</pre>
            </body>
            </html>";
            var renderer = new ChromePdfRenderer();
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            pdf.SaveAs("F://weather_report.pdf");
            Console.WriteLine("PDF generated successfully!");
        }
        else
        {
            Console.WriteLine($"Failed to retrieve content. Status code: {response.StatusCode}");
        }
    }
}

C# HttpClient(Wie es für Entwickler funktioniert): Abbildung 2 - PDF-Ausgabe

Denken Sie daran, "YOUR_API_KEY" durch einen API-Schlüssel zu ersetzen, wenn Sie eine echte Wetter-API verwenden.

Schlussfolgerung

C# HttpClient(Wie es für Entwickler funktioniert): Abbildung 3 - Lizenzierung

In diesem Tutorial wurde die Verwendung der Klasse HttpClient in C# zum Senden von HTTP-Anfragen und Verarbeiten von Antworten untersucht. Außerdem haben wir IronPDF vorgestellt, eine leistungsstarke Bibliothek zur Erzeugung von PDFs in .NET-Anwendungen. Wir haben gezeigt, wie diese Technologien kombiniert werden können, indem HTML-Inhalte von einem Webdienst mit HttpClient abgerufen und mit IronPDF in PDF konvertiert werden.

IronPDF bietet eine kostenlose Testversion an, und seine Lizenzen beginnen bei $749, was es zu einem wertvollen Werkzeug für Entwickler macht, die umfassende PDF-Erstellungsmöglichkeiten suchen.

Kannaopat Udonpant

Kannapat Udonpant

Software-Ingenieur

 LinkedIn

Bevor er Software-Ingenieur wurde, promovierte Kannapat an der Universität Hokkaido in Japan im Bereich Umweltressourcen. Während seines Studiums wurde Kannapat auch Mitglied des Vehicle Robotics Laboratory, das Teil der Abteilung für Bioproduktionstechnik ist. Im Jahr 2022 wechselte er mit seinen C#-Kenntnissen zum Engineering-Team von Iron Software, wo er sich auf IronPDF konzentriert. Kannapat schätzt an seiner Arbeit, dass er direkt von dem Entwickler lernt, der den Großteil des in IronPDF verwendeten Codes schreibt. Neben dem kollegialen Lernen genießt Kannapat auch den sozialen Aspekt der Arbeit bei Iron Software. Wenn er nicht gerade Code oder Dokumentationen schreibt, kann man Kannapat normalerweise beim Spielen auf seiner PS5 oder beim Wiedersehen mit The Last of Us antreffen.
< PREVIOUS
C# AES-Verschlüsselung (Wie es für Entwickler funktioniert)
NÄCHSTES >
C# Discriminated Union (Wie es für Entwickler funktioniert)