С#: HttpClient с параметрами POST
Я использую коды ниже для отправки запроса POST на сервер:
string url = "http://myserver/method?param1=1¶m2=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¶m2=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?