web-dev-qa-db-ja.com

C#:POSTパラメーターを使用したHttpClient

以下のコードを使用して、POSTリクエストをサーバーに送信します。

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

デバッグするサーバーにアクセスできませんが、知りたいのですが、このリクエストはPOSTまたはGET?

GETの場合、param1とparam2をPOSTデータ(URLにない))として送信するようにコードを変更するにはどうすればよいですか?

22
Sabeti

よりクリーンな代替策は、Dictionaryを使用してパラメーターを処理することです。結局、これらはキーと値のペアです。

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

また、キーワードusingを使用しない場合は、Dispose() HttpClientを忘れないでください

Microsoft docs のHttpClientクラスの備考セクションで述べたように、HttpClientは一度インスタンス化して再利用する必要があります。

編集:

response.EnsureSuccessStatusCode();の代わりに if (response.StatusCode == HttpStatusCode.OK) を調べることもできます。

HttpClientを保持し、Dispose()してはいけません。参照: HttpClientとHttpClientHandlerは破棄する必要がありますか?

46
aloisdg