Search code examples
asp.netasp.net-coredotnet-httpclientbad-request

Request Body Parameters Bad Request API HttpClient


I'm getting "Bad Request": "card_number should contain numbers only", trying to consum an API. What am I doing wrong? Could some one help?

enter image description here

API Parameters must be:

Header Parameters

  1. Content-type = "application/json; charset=utf-8"
  2. Authorization = "Bearer AuthString"
  3. seller_id = "string "

RequestBody

  1. card_number = "string"
  2. customer_id = "string"

[POST]

"curl -X POST \\nhttps://api-sandbox.getnet.com.br/v1/tokens/card \\n-H 'authorization: Bearer ca22a2ge-1914-4b0c-a0fb-d3ce0fde7346' \\n-H 'content-type: application/json; charset=utf-8' \\n-d '{\n \"card_number\": \"4012001037141112\"\n}'\n"

    public async Task<IActionResult> AuthGetToken()
    {
        using (var httpClient = new HttpClient())
        {
            parameters = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("card_number", "4012001037141112"), //(APi's card number given for tests purpose)
                new KeyValuePair<string, string>("customer_id", "custumer123")
            };

            requestMessage = new HttpRequestMessage()
            {
                Method = new HttpMethod("POST"),
                RequestUri = new Uri("https://api-sandbox.getnet.com.br/v1/tokens/card"),
                Content = new FormUrlEncodedContent(parameters)
            };
            requestMessage.Headers.Clear();
            requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            requestMessage.Headers.Add("Authorization", "Bearer ca22a2ge-1914-4b0c-a0fb-d3ce0fde7346");
            requestMessage.Headers.Add("seller_id", "61c53d30-0d7f-3cf0-7662-c61714942d46");

            response = await httpClient.SendAsync(requestMessage);
            responseStatusCode = response.StatusCode;
            responseBody = await response.Content.ReadAsStringAsync();
            response.EnsureSuccessStatusCode();
        }

        return View();
     }

Solution

  • You are trying to send request as application/json but you specify body parameters as application/x-www-form-urlencoded (using FormUrlEncodedContent class). Just change your code to send json string instead

    public class MyRequest
    {
        [JsonProperty("card_number")]
        public string CardNumber { get; set; }
    
        [JsonProperty("customer_id")]
        public string CustomerId { get; set; }
    }
    
    using (var httpClient = new HttpClient())
    {
        var request = new MyRequest
        {
            CardNumber = "4012001037141112",
            CustomerId = "custumer123"
        };
    
        var requestBody = JsonConvert.SerializeObject(request);
    
        var requestMessage = new HttpRequestMessage()
        {
            Method = new HttpMethod("POST"),
            RequestUri = new Uri("https://api-sandbox.getnet.com.br/v1/tokens/card"),
            Content = new StringContent(requestBody, Encoding.UTF8, "application/json")
        };
        requestMessage.Headers.Add("Authorization", "Bearer ca22a2ge-1914-4b0c-a0fb-d3ce0fde7346");
        requestMessage.Headers.Add("seller_id", "61c53d30-0d7f-3cf0-7662-c61714942d46");
    
        var response = await httpClient.SendAsync(requestMessage);
        var responseStatusCode = response.StatusCode;
        var responseBody = await response.Content.ReadAsStringAsync();
        response.EnsureSuccessStatusCode();
    }