Как вы UrlEncode без использования системы.Веб?
Я пытаюсь написать клиентское приложение windows, которое вызывает веб-сайт для данных. Чтобы свести установку к минимуму, я пытаюсь использовать только библиотеки DLL в профиле клиента .NET Framework. Проблема в том, что мне нужно UrlEncode некоторые параметры, есть ли простой способ сделать это без импорта системы.Сеть.dll, которая не является частью клиентского Pofile?
8 ответов:
System.Uri.EscapeUriString()
может быть проблематично с определенными символами, для меня это был знак числа / фунта '#' в строке.Если это проблема для вас, попробуйте:
System.Uri.EscapeDataString() //Works excellent with individual values
вот так Вопрос ответ, который объясняет разницу:
в чем разница между EscapeUriString и EscapeDataString?
и рекомендует использовать
Uri.EscapeDataString()
в любом аспекте.
в .Net 4.5 + используйте
WebUtility
просто для форматирования я представляю это как ответ.
не смог найти никаких хороших примеров, сравнивая их так:
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));
выходы:
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
в .Net 4.5 + используйте
WebUtility
.UrlEncode
это похоже на репликацию
HttpUtility.UrlEncode
(pre-v4. 0) для более распространенных символов:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Примечание:EscapeUriString
сохранит допустимую строку uri, которая вызывает он должен использовать как можно больше символов открытого текста.см. этот ответ для таблицы, сравнивающей различные кодировки:
https://stackoverflow.com/a/11236038/555798Разрывы Строк Все они перечислены здесь (кроме
HttpUtility.HtmlEncode
) преобразует"\n\r"
на%0a%0d
или%0A%0D
пожалуйста, не стесняйтесь редактировать это и добавлять новые символы в мою тестовую строку, или оставить их в комментариях, и я буду редактировать оно.
можно использовать
Uri.EscapeUriString (см. http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)
ответы здесь очень хороши, но все еще недостаточны для меня.
Я написал небольшой цикл, который сравнивает
Uri.EscapeUriString
СUri.EscapeDataString
для всех символов от 0 до 255.Примечание: обе функции имеют встроенный интеллект, что символы выше 0x80 сначала кодируются UTF-8, а затем закодированы в процентах.
вот результат:
******* 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
используется для кодирования URL-адресов, в то время какEscapeDataString
должен использоваться для кодирования, например, содержимого a Cookie, потому что данные Cookie не должны содержать зарезервированные символы'='
и';'
.
в системе клиентского профиля есть полезная версия, класс System.Net.WebUtility.файл DLL. Вот ссылка MSDN:
вот пример отправки запроса POST, который правильно кодирует параметры с помощью
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); }
для UrlEncode без использования системы.Веб-сайт:
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());
более детально: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/