На сайте 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
подразумевает?
Образец кода вводит в заблуждение, поскольку 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.
Как указал Макс Торо, примеры на сайте MSDN неверны: правильная форма POST требует, чтобы данные были закодированы в URL; поскольку данные в примере MSDN не содержат символов, которые были бы изменены кодировкой, они, в некотором смысле, уже закодированы.
Правильный код должен содержать System.Web.HttpUtility.UrlEncode
вызов для имен и значений каждой пары имя/значение перед объединением их в строку name1=value1&name2=value2
.
Эта страница была полезна: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx