C # веб-запрос с вопросом о кодировке POST - PullRequest
9 голосов
/ 03 июня 2010

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

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?

Ответы [ 2 ]

11 голосов
/ 03 июня 2010

Пример кода вводит в заблуждение, потому что 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 используется для преобразования строки (приложение медиа-типа/ x-www-form-urlencoded в нашем случае) в массив байтов, чего и ожидает API WebRequest.

9 голосов
/ 03 июня 2010

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

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

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

...