2010-06-21 13 views
11

J'essaie d'envoyer un message codé par URL à une API REST implémentée en PHP. Les données de message contient deux chaînes fournies par l'utilisateur:Comment faire pour échapper des données codées en URL dans POST avec 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); 
} 

Cela envoie une requête HTTP au serveur contenant user=myusername&password=mypassword en UTF-8 comme ses données POST.

Comment puis-je échapper les chaînes fournies par l'utilisateur? Par exemple, si j'avais un utilisateur nommé big&mean, comment l'esperluette devrait-elle être échappée afin qu'elle ne gâche pas la ligne de demande?

Répondre

17

Vous pouvez utiliser la classe statique HttpUtility dans System.Web pour l'encodage et le décodage des valeurs associées à HTML et Url.

Essayez HttpUtility.UrlEncode().

+0

Merci! Si j'utilise cette méthode sur une chaîne contenant des caractères UTF-8, comme un allemand s-z, la paire de codes UTF-8 est transformée en '% c3% 9f'. Je suppose que cela signifie que 'Content-Transfer-Encoding' devrait être réglé sur' 7bit' maintenant? – Cygon

+0

L'un des paramètres que vous pouvez fournir avec HttpUtility.UrlEncode est le codage. Les numéros de caractères utilisés après le '%' dépendent du codage. – pauloya

-3

Il semblerait que System.Web est obsolète - la nouvelle façon d'y accéder est System.Net.WebUtility.HtmlEncode

+9

HtmlEncode est pour échapper des données en HTML, pas d'URL. – Ralf

+1

HtmlEncode n'est pas la même chose que UrlEncode. HtmlEncode convertira "<" en "<", tandis que UrlEncode le convertira en "% 3c". –