С#: HttpClient с параметрами POST

Я использую коды ниже для отправки запроса 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-адресе)?

Ответ 1

Как сказал Бен, вы отправляете свой запрос (HttpMethod.Post, указанный в вашем коде)

Параметры запроса (get), включенные в ваш URL, вероятно, ничего не сделают.

Попробуйте следующее:

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

Ответ 2

Более простой альтернативой будет использование 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);
}

Также не забывайте Dispose() HttpClient, если вы не используете ключевое слово using

Как указано в разделе "Замечания" класса HttpClient в Microsoft docs, HttpClient должен быть создан один раз и повторно использован.

Edit:

Вы можете посмотреть response.EnsureSuccessStatusCode(); вместо if (response.StatusCode == HttpStatusCode.OK).

Возможно, вы захотите сохранить свой HttpClient и dont Dispose(). См.: Должны ли быть удалены HttpClient и HttpClientHandler?