2014-12-09 12 views
10

I-Codes verwenden unter POST-Anforderung an einen Server zu senden:C#: Httpclient mit POST-Parameter

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); 

Ich habe keinen Zugriff auf den Server zu debuggen, aber ich wissen will, ist diese Anfrage gesendet, wie POST oder GET?

Wenn es GET ist, wie kann ich meinen Code ändern, um param1 & param2 als POST-Daten (nicht in der URL) zu senden?

+3

Es wird als Post gesendet, 'neue HttpRequestMessage (HttpMethod.Post, URL)', durch die Übergabe in 'HttpMethod.Post' Sie erstellen eine POST-Anfrage. Was sind Param1 und Param2? –

+0

Versuchen Sie es mit Fiddler? – SanyTiger

+0

@BenRobinson Danke. param1 & param2 sind meine Parameter, die ich ihnen als POST-Parameter ABER Query String senden möchte. –

Antwort

-3

Wie Ben sagte Mitteilung verfassen Sie Ihre Anfrage (HttpMethod.Post im Code angegeben)

Die Abfragezeichenfolgeflag (get) in Ihrer URL enthalten Parameter wird wahrscheinlich nichts tun.

Versuchen Sie folgendes:

string url = "http://myserver/method";  
string content = "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,content); 

HTH,

bovako

+0

@JohnCroneh das funktioniert nicht mehr. Bitte akzeptieren Sie die andere Antwort unten! –

+0

@JohnCroneh Bitte ändern Sie die angenommene Antwort auf eine, die funktioniert –

+1

@ R.McManaman Eigentlich ist es eine gute Antwort, wenn Sie mit der Erstellung eines unbekannten Methodentyp gehen würde. Es fehlt etwas "verwenden", um sicherzustellen, dass es disposed und ein "stellen Sie sicher, es ist konvertiert", aber es folgt die PostAsync-Wrapper-Implementierung. – HellBaby

22

Eine sauberere Alternative wäre eine Dictionary zu verwenden Parameter zu handhaben. Sie sind schließlich Schlüssel-Wert-Paare.

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); 
} 

nicht auch zu Dispose() vergessen Httpclient, wenn Sie verwenden nicht das Schlüsselwort using

Wie in den Microsoft docs im Bemerkung Abschnitt der Httpclient-Klasse angegeben, sollte Httpclient einmal instanziiert werden und wiederverwendet .

Edit:

Möglicherweise möchten Sie in response.EnsureSuccessStatusCode(); statt if (response.StatusCode == HttpStatusCode.OK) suchen.

Sie können Ihren HttpClient behalten und nicht Dispose() es. Siehe: Do HttpClient and HttpClientHandler have to be disposed?