Search code examples
c#asp.net-coredotnet-httpclient

unable to convert curl request to HttpClient/AnyOtherPackage in asp.net core


I have a curl request, which is valid:

curl --insecure -X POST 'https://someurl' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'k1=v1' --data-urlencode 'k2=v2' --data-urlencode 'k3=v3' --data-urlencode 'k4=v4' --data-urlencode 'k5=v5'

I've tried multiple solutions from SO but unfortunately, I'm unable to convert it to HttpClient request, I'm getting a BadRequest. My code is:

        var client = new HttpClient();

        // var dict = new Dictionary<string, string>();
        // dict.Add("k1", "v1");
        // dict.Add("k2", "v2");
        // dict.Add("k3", "v3");
        // dict.Add("k4", "v4");

        var request = new HttpRequestMessage(HttpMethod.Post,
            "https://someurl");
        request.Content = new StringContent("{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\",\"k4\":\"v4\"}",
            Encoding.UTF8,
            "application/x-www-form-urlencoded");//CONTENT-TYPE header

        request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

        // request.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

        // var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(dict) };
        // var res = client.SendAsync(request);
        client.SendAsync(request)
            .ContinueWith(responseTask =>
            {
                // responseTask had badrequest status in it
            });

Solution

  • This can be shorter :

    var client = new HttpClient();
    
    var data = new Dictionary<string,string>() { { "key","val"},{"key","val"},{"key","val"},{"key","val"} };
    
    // or var data = new List<KeyValuePair<string, string>> { {new KeyValuePair<string, string>( "key","v")},{new KeyValuePair<string, string>( "key","v")},{new KeyValuePair<string, string>( "key","v")},{new KeyValuePair<string, string>( "key","v")}};
            
       var Content = new FormUrlEncodedContent(data);
    
       var res = client.PostAsync("post uri",Content).Result;
            
        Console.WriteLine(res);