AIDE .NET

C# HttpClient (Comment ça marche pour les développeurs)

Jordi Bardia
Jordi Bardia
octobre 23, 2024
Partager:

LesClasse HttpClient.NET Framework, fournit des méthodes pour envoyer des requêtes HTTP et recevoir des réponses HTTP à partir d'une ressource identifiée par un URI. Il simplifie les appels de requêtes HTTP, qu'il s'agisse de requêtes GET, POST, PUT ou DELETE. Ce guide couvrira l'utilisation essentielle de HttpClient dans des scénarios pratiques et présentera les fonctionnalités de HttpClientBibliothèque IronPDF.

Création d'une nouvelle instance de HttpClient

La classe HttpClient est utilisée pour envoyer des requêtes HTTP. Vous pouvez créer une nouvelle instance en procédant comme suit :

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);
    }
}

Dans cet exemple :

  • Une nouvelle instance HttpClient est créée en utilisant var client = new HttpClient().
  • Une requête HTTP GET est envoyée à l'aide de la méthode GetAsync.
  • Le message HttpResponseMessage est stocké dans var response.
  • Le contenu de la réponse est récupéré à l'aide de la fonction response.Content.ReadAsStringAsync().

Envoi de requêtes HTTP

Requête HTTP GET

Effectuer une requête HTTP GET et traiter la réponse :

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);
}
  • La propriété IsSuccessStatusCode garantit que la demande a abouti.
  • Le corps de la réponse est lu de manière asynchrone avec ReadAsStringAsync.

Demande HTTP POST

L'envoi d'une requête POST implique l'ajout d'un corps de requête :

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 envoie la requête avec le corps spécifié(requestBody).
  • Vous devez spécifier le type de contenu(application/JSON).

Demande HTTP PUT

Une requête HTTP PUT met à jour les ressources :

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 envoie une requête PUT pour mettre à jour la ressource à l'URI spécifié.
  • Le corps de la requête contient généralement les données à mettre à jour.

Requête HTTP DELETE

Pour envoyer une requête HTTP DELETE :

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 envoie une requête DELETE pour supprimer la ressource.

Gestion des réponses HTTP

Chaque requête HTTP renvoie un objet HttpResponseMessage, qui comprend le corps de la réponse, les en-têtes et le code d'état. Par exemple :

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 fournit le code d'état(par exemple, 200, 404).
  • response.Content contient le corps de la réponse, qui peut être lu de manière asynchrone à l'aide de ReadAsStringAsync.

Utilisation efficace de HttpClient

Les instances de HttpClient doivent être réutilisées pour exploiter la mise en commun des connexions et éviter d'épuiser les ressources du système. Un modèle typique consiste à créer une seule instance de HttpClient pour toute la durée de vie de votre application ou service. Cela peut se faire à l'aide d'une variable statique ou de l'injection de dépendances pour les applications web.

Exemple de client statique HttpClient

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;
}

L'instance HttpClient est réutilisée dans l'ensemble de l'application, ce qui réduit la charge de travail liée à la création de nouvelles connexions HTTP.

Utilisation de HttpClient avec l'injection de dépendance

Dans une application web, l'approche recommandée consiste à enregistrer HttpClient en tant que service unique :

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

Vous pouvez également créer des clients nommés et des clients typés pour des configurations plus spécifiques.

Mise en commun des connexions et paramètres du proxy

En réutilisant les instances de HttpClient, vous bénéficiez de la mise en commun des connexions, qui améliore les performances des requêtes multiples adressées au même serveur. Vous pouvez également configurer les paramètres du proxy à l'aide de la classe HttpClientHandler :

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);

Gestion des erreurs et codes d'état

Pour gérer les différents codes d'état HTTP, vérifiez la propriété 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}");
    }
}

Traitement du corps de la réponse JSON

Vous travaillez souvent avec des réponses JSON. Vous pouvez désérialiser le contenu de la réponse en un objet fortement typé :

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; }
}

La méthode ReadAsStringAsync simplifie la lecture de contenu JSON directement dans les objets C#.

Présentation d'IronPDF

C# HttpClient(Comment ça marche pour les développeurs) : Figure 1 - IronPDF

IronPDF est une bibliothèque PDF .NET conçue pour créer, manipuler et convertir des fichiers PDF en C#. Il est largement utilisé pourgénérer des PDF de haute qualité à partir de HTMLla traduction doit être réalisée dans les formats .NET, .CSS, .JavaScript et dans d'autres formats. IronPDF offre des fonctionnalités telles que la conversion de HTML en PDF, la fusion de PDF, le filigrane, et même des opérations avancées telles que les signatures numériques et le cryptage de PDF. Le logiciel est compatible avec diverses plateformes, notamment Windows, Linux et macOS, ce qui en fait une solution polyvalente pour le développement multiplateforme.

Utiliser IronPDF avec HttpClient

La combinaison d'IronPDF avec la classe HttpClient en C# est un moyen efficace de générer et de manipuler dynamiquement des documents PDF à partir de ressources web. Par exemple, vous pouvez récupérer du contenu HTML à partir d'une URL via HttpClient, puis convertir ce HTML en un document PDF à l'aide d'IronPDF. Ces outils sont utiles pour générer des rapports, des factures ou tout autre document de manière dynamique sur la base d'un contenu web en direct.

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(Comment ça marche pour les développeurs) : Figure 2 - Sortie PDF

N'oubliez pas de remplacer "YOUR_API_KEY" par une clé API lorsque vous utilisez une API météorologique réelle.

Conclusion

C# HttpClient(Comment ça marche pour les développeurs) : Figure 3 - Licence

Ce tutoriel a exploré l'utilisation de la classe HttpClient en C# pour envoyer des requêtes HTTP et gérer les réponses. Nous avons également présenté IronPDF, une puissante bibliothèque permettant de générer des PDF dans les applications .NET. Nous avons démontré comment combiner ces technologies en récupérant le contenu HTML d'un service web à l'aide de HttpClient et en le convertissant en PDF à l'aide d'IronPDF.

IronPDF propose un essai gratuit, et ses licences commencent à $749, ce qui en fait un outil précieux pour les développeurs cherchant des capacités complètes de génération de PDF.

Jordi Bardia
Ingénieur logiciel
Jordi maîtrise parfaitement Python, C# et C++. Lorsqu'il ne met pas à profit ses compétences chez Iron Software, il se consacre à la programmation de jeux. Partageant des responsabilités en matière de tests de produits, de développement de produits et de recherche, Jordi apporte une valeur ajoutée considérable à l'amélioration continue des produits. Cette expérience variée le stimule et l'engage, et il dit que c'est l'un des aspects qu'il préfère dans son travail chez Iron Software. Jordi a grandi à Miami, en Floride, et a étudié l'informatique et les statistiques à l'université de Floride.
< PRÉCÉDENT
C# AES Encryption (How It Works For Developers) (Chiffrement AES en C# (Comment ça marche pour les développeurs))
SUIVANT >
C# Discriminated Union (Comment ça marche pour les développeurs)