Comment avez-vous UrlEncode sans utiliser System.Web?
-
27-09-2019 - |
Question
Je suis en train d'écrire une application client Windows qui appelle un site Web pour les données. Pour garder l'installation à un minimum que je suis en train d'utiliser seulement dll dans le .NET Framework client Profil . Le problème est que je dois UrlEncode certains paramètres, est-il un moyen facile de faire cela sans importer System.Web.dll qui ne fait pas partie du? Pofile client
La solution
System.Uri.EscapeUriString()
peut être problématique avec certains personnages, ce fut pour moi un numéro / livre « # » signe dans la chaîne.
Si tel est un problème pour vous, essayez:
System.Uri.EscapeDataString() //Works excellent with individual values
Voici une réponse question SO qui explique la différence:
Quelle est la différence entre EscapeUriString et EscapeDataString?
et recommande à l'utilisation Uri.EscapeDataString()
dans tous les aspects.
Autres conseils
Dans .Net 4.5+ utilisation https://stackoverflow.com/a/11236038/555798
sauts de ligne
Tous les énumérés ici (autres que HttpUtility.HtmlEncode
) convertira "\n\r"
en %0a%0d
ou %0A%0D
S'il vous plaît ne hésitez pas à modifier cela et ajouter de nouveaux personnages à ma chaîne de test, ou les laisser dans les commentaires et je vais le modifier.
Vous pouvez utiliser
Uri.EscapeUriString (voir http://msdn.microsoft .com / fr-fr / bibliothèque / system.uri.escapeuristring.aspx )
Les réponses ici sont très bons, mais encore insuffisante pour moi.
J'ai écrit une petite boucle qui compare Uri.EscapeUriString
avec Uri.EscapeDataString
pour tous les caractères de 0 à 255.
NOTE:. Les deux fonctions ont intégré dans l'intelligence que les caractères ci-dessus 0x80 sont d'abord UTF-8 codé puis codé pour cent
Voici le résultat:
******* 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
doit être utilisé pour les URL encodages, alors que EscapeDataString
doit être utilisé pour coder par exemple le contenu d'un cookie, parce que les données des cookies ne doivent pas contenir les caractères réservés '='
et ';'
.
Il y a un profil de client version utilisable, classe System.Net.WebUtility, présent dans le profil client System.dll. Voici le lien MSDN:
Voici un exemple d'envoyer une requête POST qui code correctement les paramètres en utilisant le type de contenu 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);
}
Pour UrlEncode sans utiliser 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());
plus de détails: https: //www.samnoble .co.uk / 2014/05/21 / méfiez-webutility-urlencode-vs-httputility-urlencode /
System.Net.WebUtility.HtmlDecode