Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

С#: передача параметров с POST запросом

Столкнулся с интересно задачей - требуется на сервер послать параметры и в ответ получить XML.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(is_card_URL); request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(params_); request.ContentLength = bytes.Length;
using (var stream = request.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); stream.Close(); }
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream2 = response.GetResponseStream(); StreamReader reader = new StreamReader(stream2);
string data = reader.ReadToEnd();
reader.Close(); stream2.Close();
Сам код работает, но нужно вместе с УРЛ также послать параметры (допустим, а,b,c) Я пробовал дописывать в УРЛ (...?a=1&b=2&c=3), но сервер не видит параметров, в ответе он пишет, что параметры не переданы.
Подскажите пожалуйста, как в данном случае можно передать параметры на сервер?


Ответ

Параметры для POST запроса передаются немного по-другому:
string postParameters = "a=1&b=2&c=3";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(is_card_URL); request.Method = "POST"; request.ContentLength = postParameters.Length; using (var writer = new StreamWriter(request.GetRequestStream())) { requestWriter.Write(postParameters); }
Если передаваемая строка может содержать недопустимые символы, ее предварительно нужно закодировать:
string parameters = ...; string postParameters = HttpUtility.UrlEncode(parameters);
Дополнительно можно указать желаемую кодировку:
using (var writer = new StreamWriter(request.GetRequestStream(), Encoding.UTF8))
В общем случае, когда нужно передать произвольные данные, используется байтовый массив:
byte[] postData = ...; request.ContentLength = postData.Length; using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); }
Тогда пример с передачей строки можно свести к следующему коду:
string parameters = ...; byte[] postData = Encoding.UTF8.GetBytes(HttpUtility.UrlEncode(parameters)); request.ContentLength = postData.Length; using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); }

Комментариев нет:

Отправить комментарий