web-dev-qa-db-fra.com

Comment envoyer un corps de message dans la requête HttpClient dans Windows Phone 8?

J'ai écrit le code ci-dessous pour envoyer des en-têtes, des paramètres de publication. Le problème est que j'utilise SendAsync car ma requête peut être GET ou POST. Comment puis-je ajouter POST Corps à ce morceau de code afin que, s’il existe des données post-body, elles soient ajoutées à la demande que je fais et si son simple GET ou POST sans le corps, il envoie la demande de cette façon. Veuillez mettre à jour le code ci-dessous:

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();
41
Balraj Singh

Cela dépend de quel contenu avez-vous. Vous devez initialiser votre requestMessage.Content propriété avec new HttpContent . Par exemple:

...
// Add request body
if (isPostRequest)
{
    requestMessage.Content = new ByteArrayContent(content);
}
...

content est votre contenu encodé. Vous devez également inclure un en-tête de type de contenu correct.

MISE À JOUR:

Oh, ça peut être encore mieux (à partir de ceci réponse ):

requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
89
Ilya Luzyanin

Je l'ai implémenté de la manière suivante. Je voulais une méthode générique MakeRequest qui puisse appeler mon API et recevoir le contenu du corps de la demande - et également désérialiser la réponse dans le type souhaité. Je crée un Dictionary<string, string> objet pour héberger le contenu à soumettre, puis définir la propriété HttpRequestMessageContent avec elle:

Méthode générique pour appeler l'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}");
            }
        }
    }

Appelez la méthode:

    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);
    }
5
Adam Hey