I have written the code below to send headers, post parameters. The problem is that I am using SendAsync since my request can be GET or POST. How can I add POST Body to this peice of code so that if there is any post body data it gets added in the request that I make and if its simple GET or POST without body it send the request that way. Please update the code below:
HttpClient client = new HttpClient(); // Add a new Request Message HttpRequestMessage requestMessage = new HttpRequestMessage(RequestHTTPMethod, ToString()); // Add our custom headers if (RequestHeader != null) { foreach (var item in RequestHeader) { requestMessage.Headers.Add(item.Key, item.Value); } } // Add request body // Send the request to the server HttpResponseMessage response = await client.SendAsync(requestMessage); // Get the response responseString = await response.Content.ReadAsStringAsync();
The HttpRequestMessage class contains headers, the HTTP verb, and potentially data. This class is commonly used by developers who need additional control over HTTP requests. Common examples include the following: To examine the underlying SSL/TLS transport information. To use a less-common HTTP method.
From @Craig Brown:
As of .NET 5 you can do:
requestMessage.Content = JsonContent.Create(new { Name = "John Doe", Age = 33 });
See JsonContent class documentation
Oh, it can be even nicer (from this answer):
requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
This depends on what content do you have. You need to initialize your requestMessage.Content
property with new HttpContent. For example:
... // Add request body if (isPostRequest) { requestMessage.Content = new ByteArrayContent(content); } ...
where content
is your encoded content. You also should include correct Content-type header.
I implemented it in the following way. I wanted a generic MakeRequest
method that could call my API and receive content for the body of the request - and also deserialise the response into the desired type. I create a Dictionary<string, string>
object to house the content to be submitted, and then set the HttpRequestMessage
Content
property with it:
Generic method to call the API:
private static T MakeRequest<T>(string httpMethod, string route, Dictionary<string, string> postParams = null) { using (var client = new HttpClient()) { HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod(httpMethod), $"{_apiBaseUri}/{route}"); if (postParams != null) requestMessage.Content = new FormUrlEncodedContent(postParams); // This is where your content gets added to the request body HttpResponseMessage response = client.SendAsync(requestMessage).Result; string apiResponse = response.Content.ReadAsStringAsync().Result; try { // Attempt to deserialise the reponse to the desired type, otherwise throw an expetion with the response from the api. if (apiResponse != "") return JsonConvert.DeserializeObject<T>(apiResponse); else throw new Exception(); } catch (Exception ex) { throw new Exception($"An error ocurred while calling the API. It responded with the following message: {response.StatusCode} {response.ReasonPhrase}"); } } }
Call the method:
public static CardInformation ValidateCard(string cardNumber, string country = "CAN") { // Here you create your parameters to be added to the request content var postParams = new Dictionary<string, string> { { "cardNumber", cardNumber }, { "country", country } }; // make a POST request to the "cards" endpoint and pass in the parameters return MakeRequest<CardInformation>("POST", "cards", postParams); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With