#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 для потоков, запросов и прочих освобождаемых ресурсов. Это источник потенциальных проблем
Комментариев нет:
Отправить комментарий