2010-06-21 1 views
11

Я пытаюсь отправить URL-кодированный пост в REST API, реализованный в PHP. Данные POST содержит два предоставленные пользователем строки:Как избежать URL-кодированных данных в POST с HttpWebRequest

WebRequest request = HttpWebRequest.Create(new Uri(serverUri, "rest")); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
request.Headers.Add("Content-Transfer-Encoding", "binary"); 

// Form the url-encoded credentials we'll use to log in 
StringBuilder builder = new StringBuilder(); 
builder.Append("user="); 
builder.Append(user); 
builder.Append("&password="); 
builder.Append(password); 
byte[] credentials = Encoding.UTF8.GetBytes(builder.ToString()); 

// Write the url-encoded post data into the request stream. 
request.ContentLength = credentials.Length; 
using (Stream requestStream = request.GetRequestStream()) { 
    requestStream.Write(credentials, 0, credentials.Length); 
} 

Это посылает запрос HTTP на сервер, содержащий user=myusername&password=mypassword в UTF-8 в качестве данных POST его.

Как я могу избежать введенных пользователем строк? Например, если у меня был пользователь с именем big&mean, как амперсанд должен быть экранирован, чтобы он не испортил строку запроса?

ответ

17

Вы можете использовать статический класс HttpUtility в System.Web для кодирования и декодирования значений HTML и Url.

Пробег: HttpUtility.UrlEncode().

+0

Спасибо! Если я использую этот метод для строки, содержащей символы UTF-8, такие как немецкий s-z, пара кодов UTF-8 превращается в '% c3% 9f'. Я предполагаю, что это означает, что теперь 'Content-Transfer-Encoding' должен быть установлен на' 7bit'? – Cygon

+0

Одним из параметров, которые вы можете предоставить с помощью HttpUtility.UrlEncode, является кодировка. Номера символов, используемые после «%», зависят от кодировки. – pauloya

-3

Казалось бы, что System.Web является устаревшим - более новый способ доступа к ней является System.Net.WebUtility.HtmlEncode

+9

HtmlEncode предназначен для экранирования данных в HTML, а не URL. – Ralf

+1

HtmlEncode - это не то же самое, что UrlEncode. HtmlEncode преобразует «<» в «<», тогда как UrlEncode будет скрывать его до «% 3c». –