2010-06-02 11 views
8

Sul sito MSDN c'è un example of some C# code che mostra come effettuare una richiesta web con i dati POST. Ecco un estratto di tale codice:Richiesta Web C# con domanda di codifica 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 linea segnato (*) è la linea che mi lascia perplesso. I dati non dovrebbero essere codificati usando il metodo UrlEncode piuttosto che UTF8? Non è quello che implica application/x-www-form-urlencoded?

risposta

11

Il codice di esempio è fuorviante, perché ContentType è impostato su application/x-www-form-urlencoded ma il contenuto effettivo è testo normale. application/x-www-form-urlencoded è una stringa del tipo:

name1=value1&name2=value2 

La funzione UrlEncode viene utilizzato per sfuggire caratteri especial come '&' e '=' quindi un parser non li considera come sintassi. Prende una stringa (tipo di testo text/plain) e restituisce una stringa (tipo di media application/x-www-form-urlencoded).

Encoding.UTF8.GetBytes viene utilizzato per convertire la stringa (tipo di supporto application/x-www-form-urlencoded nel nostro caso) in una matrice di byte, che è ciò che si aspetta l'API WebRequest.

+0

Può application/x-www-form-urlencoded includono caratteri non ASCII? Ho interpretato questo per significare no. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 o lo sto fraintendendo? –

+0

Come nota in precedenza da Martin Smith, 'application/x-www-form-urlencoded' indica che il contenuto è stato codificato in un modo specifico. In che modo utilizzare Encoding.UTF8 risolve questo problema? – rlandster

+0

@ Martin Smith: non so. Basta usare la funzione UrlEncode per codificare i nomi e i valori e si dovrebbe andare bene. Penso che l'esempio usi UTF8 perché è quello che sono le stringhe letterali in C#. –

9

Come indicato da Max Toro, gli esempi sul sito MSDN non sono corretti: un modulo corretto POST richiede che i dati siano codificati URL; poiché i dati nell'esempio MSDN non contengono caratteri che potrebbero essere modificati dalla codifica, sono, in un certo senso, già codificati.

Il codice corretto avrebbe una chiamata System.Web.HttpUtility.UrlEncode sui nomi e sui valori di ogni coppia nome/valore prima di combinarli nella stringa name1=value1&name2=value2.

Questa pagina è stata utile: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Problemi correlati