Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to log outgoing HttpClient request?

I want to connect to REST Api, but it keeps returning status code 400 (Bad Request) no matter how I build the request.

HttpResponseMessage response = client.PostAsync(url, content).Result;

response.EnsureSuccessStatusCode();

My question is, how can I debug my https request to the server ? I would like to see, how my HTTP Request looks like.

I tried to use DiagnosticSource class, so I created Observer classes and subscribe all listeners to it.

Observer

class Observer : IObserver<DiagnosticListener>
    {
        public void OnCompleted()
        {
            throw new NotImplementedException();
        }

        public void OnError(Exception error)
        {
            throw new NotImplementedException();
        }

        public void OnNext(DiagnosticListener value)
        {
            if (value.Name == "HttpHandlerDiagnosticListener")
            {
                value.Subscribe(new HttpClientObserver());
            }
        }
    }

HttpClientObserver

 class HttpClientObserver : IObserver<KeyValuePair<string, object>>
        {
            public void OnCompleted()
            {
                throw new NotImplementedException();
            }
    
            public void OnError(Exception error)
            {
                throw new NotImplementedException();
            }
    
            public void OnNext(KeyValuePair<string, object> value)
            {
                throw new NotImplementedException();
            }
        }

Main

static void Main(string[] args)
        {
            DiagnosticListener.AllListeners.Subscribe(new Diagnostic.Observer());

            // execute HttpClient methods do not throw any event to Observer

But no event was catched. What am I missing, does HttpClient support's DiagnosticSource (How can I recognize which classes do ?). What other solution I can use ?

like image 561
Muflix Avatar asked Sep 04 '25 16:09

Muflix


1 Answers

One of the best solutions is you use the HttpClientToCurl extension in your codes for a better understanding of what send request exactly. This extension will help you to see whatever is set in HttpClient in the form of a curl script.

You have 3 ways to see script results:

1- Show in the console:

httpClient.GenerateCurlInConsole(httpRequestMessage, null);

2- Write in a file:

httpClient.GenerateCurlInFile(httpRequestMessage, null);

3- Put into a variable:

string script = httpClient.GenerateCurlInString(httpRequestMessage, null);

Also, the HttpClientToCurl extension has attractive configs that you can see examples in GitHub Address. Moreover, you see the source of the project and see more examples.

This is a complete example when you want to send a request:

string requestBody = @"{""name"":""sara"",""requestId"":""10001001"",""amount"":20000}";
string requestUri = "api/test";
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri);
httpRequestMessage.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
httpRequestMessage.Headers.Add("Authorization", $"Bearer {Guid.NewGuid().ToString()}");

using var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("http://localhost:1213/v1/");

httpClient.GenerateCurlInConsole(
    httpRequestMessage,
    config =>
    {
        config.TurnOn = true;
        config.NeedAddDefaultHeaders = true;
        config.EnableCodeBeautification = false;
    });

 // Call PostAsync => await client.PostAsync(requestUri, httpRequest.Content);

The extension result is:

curl -X POST 'http://localhost:1213/v1/api/test' -H 'Authorization: Bearer 4797c126-3f8a-454a-aff1-96c0220dae61' -H 'Content-Type: application/json; charset=utf-8' -d '{""name"":""sara"",""requestId"":10001001,""amount"":20000}'"
like image 197
Amin Golmahalle Avatar answered Sep 07 '25 10:09

Amin Golmahalle