Maison >développement back-end >C++ >Comment enregistrer les messages JSON de requête et de réponse HTTP à l'aide de HttpClient ?

Comment enregistrer les messages JSON de requête et de réponse HTTP à l'aide de HttpClient ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-31 14:22:10361parcourir

How to Log HTTP Request and Response JSON Messages using HttpClient?

Consignation des messages de demande et de réponse HTTP à l'aide de HttpClient

Dans les situations où vous devez capturer les messages de demande et de réponse pendant la communication HTTP à l'aide de HttpClient, la journalisation devient essentielle. Considérez l'extrait de code suivant :

var response = await client.PostAsJsonAsync(url, entity);

if (response.IsSuccessStatusCode)
{
    return await response.Content.ReadAsAsync<T>();
}

Voyons maintenant comment obtenir la charge utile JSON envoyée dans l'objet « entité » sans la sérialiser manuellement.

Solution : journalisation personnalisée Gestionnaire

Pour intercepter et enregistrer les messages de demande et de réponse, vous pouvez créer un gestionnaire de journalisation personnalisé qui entoure le HttpClientHandler. Ce gestionnaire interceptera les requêtes avant que HttpClientHandler ne les traite. Un exemple d'implémentation pourrait être :

public class LoggingHandler : DelegatingHandler
{
    public LoggingHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Console.WriteLine("Request:");
        Console.WriteLine(request.ToString());
        if (request.Content != null)
        {
            Console.WriteLine(await request.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        Console.WriteLine("Response:");
        Console.WriteLine(response.ToString());
        if (response.Content != null)
        {
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        return response;
    }
}

Dans ce gestionnaire :

  • Console.WriteLine(request.Content.ReadAsStringAsync()) lit le contenu de la requête, ce qui amène le formateur à sérialiser l'objet entité dans JSON.
  • Console.WriteLine(response.Content.ReadAsStringAsync()) fait de même pour le contenu de la réponse.

Chaînage du gestionnaire de journalisation avec HttpClient

Pour utiliser le gestionnaire de journalisation, vous devez le chaîner à votre HttpClient :

HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler()));
HttpResponseMessage response = client.PostAsJsonAsync(baseAddress + "/api/values", "Hello, World!").Result;

Exemple de sortie

La sortie du code ci-dessus ressemblerait à ceci :

Request:
Method: POST, RequestUri: 'http://kirandesktop:9095/api/values', Version: 1.1, Content: System.Net.Http.ObjectContent`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Headers:
{
    Content-Type: application/json; charset=utf-8
}
"Hello, World!"

Response:
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
    Date: Fri, 20 Sep 2013 20:21:26 GMT
    Server: Microsoft-HTTPAPI/2.0
    Content-Length: 15
    Content-Type: application/json; charset=utf-8
}
"Hello, World!"

En utilisant cette approche, vous pouvez enregistrer efficacement les messages JSON de demande et de réponse lors des appels HTTP effectués avec HttpClient, fournissant ainsi des informations précieuses pour le débogage et le dépannage fins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn