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

后端 未结 2 1668
广开言路
广开言路 2020-12-24 04:55

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

相关标签:
2条回答
  • 2020-12-24 05:10

    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.

    UPDATE:

    Oh, it can be even nicer (from this answer):

    requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
    
    0 讨论(0)
  • 2020-12-24 05:17

    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);
        }
    
    0 讨论(0)
提交回复
热议问题