Încerc să scriu un windows aplicație client care solicită un site web pentru date. Pentru a menține instala la minim încerc să utilizați numai dll-uri în .NET Framework Client Profil. Problema este că am nevoie pentru a UrlEncode unor parametri, există o modalitate ușoară de a face acest lucru fără a importa System.Web.dll care nu este parte a Clientului Pofile?
Sistemul.Uri.EscapeUriString()
poate fi problematic cu anumite personaje, pentru mine a fost un număr / kg '#' semn în șir.
Dacă asta este o problemă pentru tine, încercați:
System.Uri.EscapeDataString() //Works excellent with individual values
Aici este o ASTFEL de întrebare răspuns care explică diferența:
și recomandă să utilizați Uri.EscapeDataString()
în orice aspect.
În .Net 4.5+ utilizare WebUtility
Doar pentru formatarea I'm a depune acest lucru ca pe un răspuns.
N't găsi orice exemple bune comparându-le astfel:
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));
Ieșiri:
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
În .Net 4.5+ utilizare WebUtility
.UrlEncode
Acest lucru pare să reproducă HttpUtility.UrlEncode
(pre-v4.0) pentru mai multe caractere comune:
Uri.EscapeDataString(testString).Înlocui("%20", "+").Înlocui("'", "%27").Înlocui("~", "%7E")
Notă: EscapeUriString
va păstra un valabile uri șir de caractere, care provoacă-l pentru a folosi cât mai multe plaintext personaje posibil.
Vezi acest răspuns pentru un Tabel pentru a Compara diverse Codificări:
https://stackoverflow.com/a/11236038/555798
Pauze De Linie
Toate acestea enumerate aici (altele decât HttpUtility.HtmlEncode
) va converti "\n\r,"
în %0a%0d " sau " %0A%0D
Vă rugăm să simțiți-vă liber pentru a edita acest lucru și adăuga noi personaje pentru a-mi testa șir, sau lăsați-le în comentarii și m-am'll edita.
Puteți utiliza
Uri.EscapeUriString (a se vedea http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)
Raspunsurile de aici sunt foarte bune, dar încă insuficientă pentru mine.
Am scris o mică buclă, care compară `Uri.EscapeUriString " cu " Uri.EscapeDataString pentru toate caracterele de la 0 la 255.
NOTĂ: Ambele funcții au construit-in de informații care personajele de mai sus 0x80 sunt primul codificat UTF-8 și apoi la sută codificate.
Aici este rezultatul:
******* 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
este de a fi utilizate pentru a codifica Url-uri, în timp ce EscapeDataString
este de a fi utilizate pentru a codifica, de exemplu, conținutul unui Cookie, deoarece datele Cookie-urilor nu trebuie să conțină caracterele rezervate'='
și';'
.
Aici's un exemplu de a trimite o cerere POST care codifică în mod corespunzător parametrii folosind application/x-www-form-urlencoded
tip de conținut:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "param1", "value1" },
{ "param2", "value2" },
};
var result = client.UploadValues("http://foo.com", values);
}
Pentru a UrlEncode fără a utiliza Sistemul.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());
mai multe detalii: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
System.Net.WebUtility.HtmlDecode