Веб-запрос C# с вопросом о кодировании POST

На сайте MSDN существует пример некоторого кода C#, который показывает, как сделать веб-запрос с данными POST'ed. Вот выборка того кода:

WebRequest request = WebRequest.Create ("http://www.contoso.com/PostAccepter.aspx ");
request.Method = "POST";
string postData = "This is a test that posts this string to a Web server.";
byte[] byteArray = Encoding.UTF8.GetBytes (postData); // (*)
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();
WebResponse response = request.GetResponse ();
...more...

Строка отмечена (*) строка, которая озадачивает меня. Разве данные не должны быть закодированы с помощью метода UrlEncode, а не UTF8? Не это что application/x-www-form-urlencoded подразумевает?

9
задан rlandster 30 May 2011 в 16:03
поделиться

2 ответа

Образец кода вводит в заблуждение, поскольку ContentType имеет значение application / x-www-form-urlencoded, но фактическое содержимое представляет собой простой текст. application / x-www-form-urlencoded - это строка, подобная этой:

name1=value1&name2=value2

Функция UrlEncode используется для экранирования особых символов, таких как '&' и '=', поэтому синтаксический анализатор не рассматривает их как синтаксис. Он принимает строку (тип мультимедиа text / plain) и возвращает строку (тип мультимедиа application / x-www-form-urlencoded).

Encoding.UTF8.GetBytes используется для преобразования строки (медиа-тип application / x-www-form-urlencoded в нашем случае) в массив байтов, что и ожидает API WebRequest.

11
ответ дан 4 December 2019 в 10:30
поделиться

Как указал Макс Торо, примеры на сайте MSDN неверны: правильная форма POST требует, чтобы данные были закодированы в URL; поскольку данные в примере MSDN не содержат символов, которые были бы изменены кодировкой, они, в некотором смысле, уже закодированы.

Правильный код должен содержать System.Web.HttpUtility.UrlEncode вызов для имен и значений каждой пары имя/значение перед объединением их в строку name1=value1&name2=value2.

Эта страница была полезна: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

9
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: