web-dev-qa-db-fra.com

C #: HttpClient avec les paramètres POST

J'utilise les codes ci-dessous pour envoyer une demande POST à un serveur:

string url = "http://myserver/method?param1=1&param2=2"    
HttpClientHandler handler = new HttpClientHandler();
HttpClient httpClient = new HttpClient(handler);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
HttpResponseMessage response = await httpClient.SendAsync(request);

Je n'ai pas accès au serveur pour déboguer mais je veux savoir, est-ce que cette demande est envoyée comme POST ou GET?

Si c'est GET, comment puis-je changer mon code pour envoyer param1 & param2 en tant que POST (pas dans l'URL)?

22
Sabeti

Une alternative plus propre serait d'utiliser un Dictionary pour gérer les paramètres. Ce sont des paires clé-valeur après tout.

private static readonly HttpClient HttpClient;

static MyClassName()
{
    // HttpClient is intended to be instantiated once and re-used throughout the life of an application. 
    // Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. 
    // This will result in SocketException errors.
    // https://docs.Microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.7.1
    HttpClient = new HttpClient();    
} 

var url = "http://myserver/method";
var parameters = new Dictionary<string, string> { { "param1", "1" }, { "param2", "2" } };
var encodedContent = new FormUrlEncodedContent (parameters);

var response = await HttpClient.PostAsync (url, encodedContent).ConfigureAwait (false);
if (response.StatusCode == HttpStatusCode.OK) {
    // Do something with response. Example get content:
    // var responseContent = await response.Content.ReadAsStringAsync ().ConfigureAwait (false);
}

N'oubliez pas non plus de Dispose() HttpClient, si vous n'utilisez pas le mot clé using

Comme indiqué dans la section Remarques de la classe HttpClient dans Microsoft docs , HttpClient doit être instancié une fois et réutilisé.

Modifier:

Vous voudrez peut-être examiner response.EnsureSuccessStatusCode(); au lieu de if (response.StatusCode == HttpStatusCode.OK).

Vous voudrez peut-être conserver votre HttpClient et ne pas Dispose(). Voir: HttpClient et HttpClientHandler doivent-ils être supprimés?

46
aloisdg