RestSharp post request - Body with x-www-form-urlencoded values

C#PostRestsharp

C# Problem Overview


I am using postman and making an api post request where I am adding body with x-www-form-urlencoded key/values and it works fine in postman.

The issue arrises when I try it from c# using RestSharp package.

I have tried the following code below but not getting the response. I get "BadRequest" invalid_client error.

public class ClientConfig {
    public string client_id { get; set; } = "value here";
    public string grant_type { get; set; } = "value here";
    public string client_secret { get; set; } = "value here";
    public string scope { get; set; } = "value here";
    public string response_type { get; set; } = "value here";
}

public void GetResponse() {
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        req.AddHeader("Content-Type","application/x-www-form-urlencoded");
        req.AddParameter("application/x-www-form-urlencoded",config,ParameterType.RequestBody);

        var res = client.Execute(req);
        return;
    }

//Also tried this

    req.AddParameter("client_id",config.client_id,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("grant_type",config.grant_type,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("client_secret",config.client_secret,"application/x-www-form-urlencoded",ParameterType.RequestBody);
                req.AddParameter("scope",config.scope,ParameterType.RequestBody);
                req.AddParameter("response_type",config.response_type,"application/x-www-form-urlencoded",ParameterType.RequestBody);

//tried this too
var client = new RestClient("url-here");
            var req = new RestRequest("endpointhere",Method.POST);
            var config = new ClientConfig();
req.AddBody(config);
var res = client.Execute(req);

C# Solutions


Solution 1 - C#

this working for me, it was generator from postman

        var token = new TokenValidation()
        {
               app_id = CloudConfigurationManager.GetSetting("appId"),
               secret = CloudConfigurationManager.GetSetting("secret"),
               grant_type = CloudConfigurationManager.GetSetting("grant_type"),
               Username = CloudConfigurationManager.GetSetting("Username"),
               Password = CloudConfigurationManager.GetSetting("Password"),
        };

        var client = new RestClient($"{xxx}{tokenEndPoint}");
        var request = new RestRequest(Method.POST);
        request.AddHeader("content-type", "application/x-www-form-urlencoded");
        request.AddParameter("application/x-www-form-urlencoded", $"app_id={token.app_id}&secret={token.secret}&grant_type={token.grant_type}&Username={token.Username}&Password={token.Password}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        if (response.StatusCode != HttpStatusCode.OK)
        {
            Console.WriteLine("Access Token cannot obtain, process terminate");
            return null;
        }

        var tokenResponse = JsonConvert.DeserializeObject<TokenValidationResponse>(response.Content);

Solution 2 - C#

I personally find this way to work better for me when sending Form-UrlEncoded data.

public void GetResponse() {
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        // Content type is not required when adding parameters this way
        // This will also automatically UrlEncode the values
        req.AddParameter("client_id",config.client_id, ParameterType.GetOrPost);
        req.AddParameter("grant_type",config.grant_type, ParameterType.GetOrPost);
        req.AddParameter("client_secret",config.client_secret, ParameterType.GetOrPost);
        req.AddParameter("scope",config.scope, ParameterType.GetOrPost);
        req.AddParameter("response_type",config.response_type, ParameterType.GetOrPost);

        var res = client.Execute(req);
        return;
}

Details on this parameter type can be found here: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#getorpost

Solution 3 - C#

Personally, I found AddObject() method quite useful, and cleaner when you have so many parameters to add.

public void GetResponse() {
        var client = new RestClient("api-url-here");
        var req = new RestRequest("endpoint-here",Method.POST);
        var config = new ClientConfig();//values to pass in request

        req.AddHeader("Content-Type","application/x-www-form-urlencoded");
        req.AddObject(config);

        var res = client.Execute(req);
        return res;
    }

Solution 4 - C#

If it worked on postman, you can just press the code button on the right hand side. This will provide a working example in multiple languages. It is the button above the information icon. I would post a screenshot of it, but I don't have 10 reputation to do so.

Solution 5 - C#

in my case this is what worked

req.AddParameter("client_id", "unigen-corporation", ParameterType.HttpHeader);
req.AddParameter("grant_type", "client_credentials", ParameterType.GetOrPost);

Solution 6 - C#

If you've copied the code from the postman, try removing the following:

request.AlwaysMultipartFormData = true;

In my case after removing this line code worked.

Solution 7 - C#

var client1 = new RestClient(URI);
var request1 = new RestRequest(Method.POST);
request1.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request1.AddParameter("client_id", "XX");
request1.AddParameter("client_secret", "XX");
request1.AddParameter("grant_type", "XX");
request1.AddParameter("role", "XX");
IRestResponse response1 = client1.Execute(request1);
System.Console.WriteLine(response1.Content);

Add parameters according to your needs. This work fine!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnicedev80View Question on Stackoverflow
Solution 1 - C#Kira HaoView Answer on Stackoverflow
Solution 2 - C#Nosfera2View Answer on Stackoverflow
Solution 3 - C#DinchView Answer on Stackoverflow
Solution 4 - C#DavidH541View Answer on Stackoverflow
Solution 5 - C#user13438492View Answer on Stackoverflow
Solution 6 - C#user1501363View Answer on Stackoverflow
Solution 7 - C#Krishna BangView Answer on Stackoverflow