2010-06-02 13 views
8

En el sitio MSDN hay un example of some C# code que muestra cómo realizar una solicitud web con datos POST'ed. He aquí un extracto de ese código:Solicitud web C# con la pregunta de codificación 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 línea marcada (*) es la línea que me intriga. ¿No deberían codificarse los datos utilizando el método UrlEncode en lugar de UTF8? ¿No es eso lo que implica application/x-www-form-urlencoded?

Respuesta

11

El código de ejemplo es engañoso, porque ContentType se establece en application/x-www-form-urlencoded pero el contenido real es texto sin formato. application/x-www-form-urlencoded es una cadena como esta:

name1=value1&name2=value2 

La función se utiliza para UrlEncode de escapar caracteres especiales como '&' y '=' por lo que un programa de análisis no tiene en cuenta como sintaxis. Toma una cadena (tipo de medio texto/plano) y devuelve una cadena (tipo de medio application/x-www-form-urlencoded).

Encoding.UTF8.GetBytes se utiliza para convertir la cadena (tipo de medio application/x-www-form-urlencoded en nuestro caso) en una matriz de bytes, que es lo que espera la API de WebRequest.

+0

puede urlencoded-x-www-formulario de solicitud/incluir caracteres no ASCII? Interpreté esto para decir que no. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 o lo estoy malinterpretando? –

+0

Como señala Martin Smith anteriormente, 'application/x-www-form-urlencoded' indica que el contenido ha sido codificado de una manera específica. ¿Cómo se usa el Encoding.UTF8 para abordar esto? – rlandster

+0

@Martin Smith: No lo sé. Simplemente use la función UrlEncode para codificar los nombres y los valores, y debería estar bien. Creo que la muestra usa UTF8 porque eso es lo que son las cadenas literales en C#. –

9

Como indicó Max Toro, los ejemplos en el sitio de MSDN son incorrectos: una forma correcta POST requiere que los datos estén codificados en la URL; dado que los datos en el ejemplo de MSDN no contienen ningún carácter que pueda modificarse mediante codificación, en cierto sentido ya están codificados.

El código correcto tendría una llamada System.Web.HttpUtility.UrlEncode en los nombres y valores de cada par de nombre/valor antes de combinarlos en la cadena name1=value1&name2=value2.

Esta página fue útil: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Cuestiones relacionadas