Страницы

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

пятница, 31 января 2020 г.

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

#c_sharp #веб_программирование #клиент_сервер


Столкнулся с интересно задачей - требуется на сервер послать параметры и в ответ
получить 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), но сервер не видит параметров, в ответе
он пишет, что параметры не переданы.

Подскажите пожалуйста, как в данном случае можно передать параметры на сервер?
    


Ответы

Ответ 1



Параметры для 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); }

Ответ 2



Если нет принципиальной необходимости работать именно через WebRequest/WebResponse, то самый простой способ - использование System.Net.WebClient.UploadValues using (WebClient client = new WebClient()) { byte[] response = client.UploadValues(is_card_URL, new NameValueCollection() { { "a", "1" }, { "a", "2" }, { "c", "3" } }); string result = UTF8.GetString(response); }

Ответ 3



В отличие от GET-запроса POST получает параметры в теле, а не в строке запроса, а размер передаваемых данных указывается в заголовке ContentLength. Сделайте например так: byte[] bytes = Encoding.UTF8.GetBytes(queryString); webRequest.ContentLength = bytes.Length; using (var stream = webRequest.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); stream.Close(); } Плюс небольшая ремарка: никогда не используйте просто Close/Dispose без using или try для потоков, запросов и прочих освобождаемых ресурсов. Это источник потенциальных проблем

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

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