2010-06-02 8 views
8

Sur le site MSDN, il y a un example of some C# code qui montre comment faire une requête Web avec des données POST'ed. Voici un extrait de ce code:Demande Web C# avec la question d'encodage 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... 

La ligne marquée (*) est la ligne qui me déconcerte. Les données ne devraient-elles pas être encodées en utilisant la méthode UrlEncode plutôt que UTF8? N'est-ce pas ce que signifie application/x-www-form-urlencoded?

Répondre

11

L'exemple de code est trompeur, car ContentType est défini sur application/x-www-form-urlencoded mais le contenu réel est du texte brut. application/x-www-form-urlencoded est une chaîne comme ceci:

name1=value1&name2=value2 

La fonction UrlEncode est utilisée pour échapper les caractères Especial comme « & » et « = » donc un analyseur ne les considère pas comme la syntaxe. Il prend une chaîne (type de média text/plain) et renvoie une chaîne (type de média application/x-www-form-urlencoded). Encoding.UTF8.GetBytes est utilisé pour convertir la chaîne (application de type de support/x-www-form-urlencoded dans notre cas) en un tableau d'octets, ce qui est attendu par l'API WebRequest.

+0

application peut/x-www-form-urlencoded comprennent des caractères non ASCII? J'ai interprété cela comme signifiant non. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 ou est-ce que je le comprends mal? –

+0

Comme le note Martin Smith ci-dessus, 'application/x-www-form-urlencoded' indique que le contenu a été codé d'une manière spécifique. Comment utilise Encoding.UTF8 pour résoudre ce problème? – rlandster

+0

@ Martin Smith: Je ne sais pas. Utilisez simplement la fonction UrlEncode pour encoder les noms et les valeurs et tout devrait bien se passer. Je pense que l'exemple utilise UTF8 parce que c'est ce que sont les chaînes littérales en C#. –

9

Comme Max Toro l'a indiqué, les exemples sur le site MSDN sont incorrects: une forme POST correcte nécessite que les données soient codées URL; Puisque les données de l'exemple MSDN ne contiennent aucun caractère qui serait modifié par codage, elles sont, dans un sens, déjà codées.

Le code correct aurait un appel System.Web.HttpUtility.UrlEncode sur les noms et les valeurs de chaque paire nom/valeur avant de les combiner dans la chaîne .

Cette page a été utile: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx