5

I have no idea how to POST JSON with HttpClient. I find some solution, like this, but I have to use HttpClient, cause of async and have to add a header.

This is my code below. Any idea how to fix it?

List<Order> list = new List<Order> { new Order() { Name = "CreatedTime", OrderBy = 1 } };

Queues items = new Queues { Orders = list };

var values = new Dictionary<string, string> { { "Orders", JsonConvert.SerializeObject(list) } };

var content = new FormUrlEncodedContent(values);

//HttpContent cc = new StringContent(JsonConvert.SerializeObject(items));

_msg = await _client.PostAsync(input, content);

//_msg = await _client.PostAsync(input, cc);

var response = await _msg.Content.ReadAsStringAsync();
jww
  • 83,594
  • 69
  • 338
  • 732
Louis
  • 113
  • 1
  • 2
  • 11

2 Answers2

11

You can use the method PostAsJsonAsync which can be found in the extensions assemblies:

System.Net.Http.Formatting.dll

Example

public static async Task SendJsonDemo(object content)
{
    using(var client = new HttpClient())
    {
        var response = await client.PostAsJsonAsync("https://example.com", content);
    }
}

If you want to add custom headers to the request, add it to DefaultRequestHeaders:

client.DefaultRequestHeaders.Add("mycustom", "header1");
Tolga Evcimen
  • 6,438
  • 10
  • 52
  • 82
Peter Mols
  • 921
  • 1
  • 8
  • 13
0

You can send any type of request like as

public static async Task<HttpResponseMessage> SendRequest(HttpMethod method, string endPoint, string accessToken,  dynamic content = null)
        {
            HttpResponseMessage response = null;
            using (var client = new HttpClient())
            {
                using (var request = new HttpRequestMessage(method, endPoint))
                {
                    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
                    if (content != null)
                    {
                        string c;
                        if (content is string)
                            c = content;
                        else
                            c = JsonConvert.SerializeObject(content);
                        request.Content = new StringContent(c, Encoding.UTF8, "application/json");
                    }

                    response = await client.SendAsync(request).ConfigureAwait(false);
                }
            }
            return response;

        }
Md. Abdul Alim
  • 615
  • 6
  • 18
  • 2
    Pretty sure I remember reading that you're not supposed instantiate an HttpClient for every call. – mwardm May 26 '20 at 22:36