Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass a Dictionary<string,string> parameter in web api

I'm trying to pass a Dictionary<string,string> object as a parameter to my web api method but if I inspect the log file it always comes through with a count of 0:

Web api method:

[HttpPost]
[ActionName("SendPost")]
public void SendPost([FromBody] Dictionary<string,string> values)
{
    using (var sw = new StreamWriter("F:\\PostTest.txt", true))
    {
        sw.WriteLine("Number of items in the dictionary - " + values.Count);
    }
}

Logic which calls the web api:

public HttpResponseMessage Send(string uri, string value)
{
    HttpResponseMessage responseMessage = null;

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(URI);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var content = new FormUrlEncodedContent
            (
                new Dictionary<string, string> { { "value", value } }
            );

        responseMessage = client.PostAsync(uri, content).Result;
    }
    return responseMessage;
}
like image 463
Denys Wessels Avatar asked Sep 17 '15 09:09

Denys Wessels


1 Answers

The problem is with the fact that you're saying the content-type is "application/json", yet you pass it as FormUrlEncodedContent. You need to either use StringContent and serialize the content to JSON yourself, or you can use the extention method HttpClientExtensions.PostAsJsonAsync which serializes the content to JSON for you:

public async Task<HttpResponseMessage> SendAsync(string uri, string value)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(URI);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
                        new MediaTypeWithQualityHeaderValue("application/json"));

        return await client.PostAsJsonAsync(uri, content);
    }
}
like image 133
Yuval Itzchakov Avatar answered Nov 13 '22 02:11

Yuval Itzchakov