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();
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);
}
...
où content
est votre contenu encodé. Vous devez également inclure un en-tête de type de contenu correct.
Oh, ça peut être encore mieux (à partir de ceci réponse ):
requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
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é HttpRequestMessage
Content
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);
}