Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send a Post body in the HttpClient request in Windows Phone 8?

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(); 
like image 296
Balraj Singh Avatar asked Aug 06 '14 10:08

Balraj Singh


People also ask

What is HttpRequestMessage?

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.


2 Answers

UPDATE 2:

From @Craig Brown:

As of .NET 5 you can do:
requestMessage.Content = JsonContent.Create(new { Name = "John Doe", Age = 33 });

See JsonContent class documentation

UPDATE 1:

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.

like image 59
Ilya Luzyanin Avatar answered Sep 23 '22 09:09

Ilya Luzyanin


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);     } 
like image 35
Adam Hey Avatar answered Sep 22 '22 09:09

Adam Hey