Come si fa a UrlEncode senza usare System.Web?
-
27-09-2019 - |
Domanda
Sto provando a scrivere un'applicazione Windows client che chiama un sito web per i dati. Per mantenere l'installazione al minimo sto provando solo utilizzare DLL in .NET Framework client Profilo . Il problema è che ho bisogno di UrlEncode alcuni parametri, c'è un modo semplice per fare questo senza importare System.Web.dll che non fa parte del Pofile client?
Soluzione
System.Uri.EscapeUriString()
può essere problematico con certi personaggi, per me è stato un / pound '#' cancelletto nella stringa.
Se questo è un problema per voi, provate:
System.Uri.EscapeDataString() //Works excellent with individual values
Ecco una domanda risposta così che spiega la differenza:
Qual è la differenza tra EscapeUriString e EscapeDataString?
e raccomanda l'uso di Uri.EscapeDataString()
in ogni aspetto.
Altri suggerimenti
In .Net 4.5+ uso WebUtility
Proprio per la formattazione sto presentando questo come una risposta.
Impossibile trovare esempi di buone confrontando in modo:
string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode: " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString: " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString: " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));
Console.WriteLine("HtmlEncode: " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode: " + System.Web.HttpUtility.UrlPathEncode(testString));
//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode: " + WebUtility.UrlEncode(testString));
Uscite:
UrlEncode: http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString: http://test#%20space%20123/text?var=val&another=two
EscapeDataString: http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
HtmlEncode: http://test# space 123/text?var=val&another=two
UrlPathEncode: http://test#%20space%20123/text?var=val&another=two
//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
In .Net 4.5+ uso WebUtility
.UrlEncode
Questo sembra HttpUtility.UrlEncode
replicando (pre-v4.0) per i personaggi più comuni:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota:. EscapeUriString
manterrà una stringa URI valido, che induce a utilizzare come molti personaggi in chiaro come possibile
Vedere questa risposta per una tabella comparativa delle varie codifiche:
https://stackoverflow.com/a/11236038/555798
interruzioni di riga
Tutti loro elencati qui (diverso HttpUtility.HtmlEncode
) ti permette di convertire in "\n\r"
%0a%0d
o %0A%0D
Non esitate a modificare questa e aggiungere nuovi personaggi alla mia stringa di prova, o lasciarli nei commenti e sarò modificarlo.
È possibile utilizzare
Uri.EscapeUriString (vedi http://msdn.microsoft .com / it-it / library / system.uri.escapeuristring.aspx )
Le risposte qui sono molto buoni, ma ancora insufficiente per me.
ho scritto un piccolo anello che mette a confronto con Uri.EscapeUriString
Uri.EscapeDataString
per tutti i caratteri da 0 a 255.
. NOTA: Entrambe le funzioni hanno l'intelligenza incorporata che i personaggi di cui sopra 0x80 sono di prima codifica UTF-8 e poi cento codificati
Ecco il risultato:
******* Different *******
'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"
******* Not escaped *******
'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"
'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"
'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"
'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"
******* UTF 8 *******
.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....
EscapeUriString
deve essere utilizzato per gli URL di codifica, mentre EscapeDataString
deve essere utilizzato per codificare ad esempio il contenuto di un cookie, in quanto i dati cookie non devono contenere i caratteri riservati '='
e ';'
.
C'è una versione profilo del cliente utilizzabile, classe System.Net.WebUtility, presente nel profilo client System.dll. Ecco il MSDN Link:
Ecco un esempio di invio di una richiesta POST che codifica correttamente i parametri con tipo di contenuto application/x-www-form-urlencoded
:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "param1", "value1" },
{ "param2", "value2" },
};
var result = client.UploadValues("http://foo.com", values);
}
Per UrlEncode senza usare System.Web:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
maggiori dettagli: https: //www.samnoble .it / 2014/05/21 / beware-webutility-urlencode-vs-httputility-urlencode /
System.Net.WebUtility.HtmlDecode