Estou tentando escrever um aplicativo cliente do Windows que chama um site para obter dados. Para manter a instalação no mínimo, estou tentando usar apenas dlls no .NET Framework Client Profile . O problema é que eu preciso UrlEncode alguns parâmetros, existe uma maneira fácil de fazer isso sem importar o System.Web.dll, que não faz parte do perfil do cliente?
c#
.net
urlencode
.net-client-profile
Martin Brown
fonte
fonte
WebRequest
ouWebClient
. Essa é a razão pela qual perguntei sobre esse código específico, porque há coisas que podem ser feitas sobre dados de codificação de URL corretamente.Respostas:
System.Uri.EscapeUriString()
pode ser problemático com certos caracteres, para mim era um sinal de número / libra '#' na string.Se esse é um problema para você, tente:
Aqui está uma resposta da pergunta SO que explica a diferença:
Qual é a diferença entre EscapeUriString e EscapeDataString?
e recomenda usar
Uri.EscapeDataString()
em qualquer aspecto.fonte
Uri.EscapeUriString
é realmente muito problemático e não deve ser usado, pois tenta fazer algo (escapando de URIs completos) que é realmente impossível de fazer de forma consistente. Consulte esta resposta para obter uma explicação detalhada.No uso do .Net 4.5+
WebUtility
Apenas para formatação, estou enviando isso como resposta.
Não foi possível encontrar bons exemplos comparando-os assim:
Saídas:
No uso do .Net 4.5+
WebUtility
.UrlEncode
Isso parece replicar
HttpUtility.UrlEncode
(pré-v4.0) para os caracteres mais comuns:Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Nota:
EscapeUriString
manterá uma string uri válida, o que fará com que use o máximo de caracteres de texto sem formatação possível.Consulte esta resposta para obter uma tabela comparando as várias codificações:
https://stackoverflow.com/a/11236038/555798
Quebras de linha Todos eles listados aqui (exceto
HttpUtility.HtmlEncode
) serão convertidos"\n\r"
em%0a%0d
ou%0A%0D
Sinta-se à vontade para editar isso e adicionar novos caracteres à minha string de teste, ou deixe-os nos comentários e eu os editarei.
fonte
EscapeDataString
, em vez deEscapeUriString
como fomos codificação retornos de carro e alimentações de linha e estes exigido o mais agressivo escapando realizada porEscapeDataString
Você pode usar
Uri.EscapeUriString (consulte http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
fonte
Uri.EscapeUriString
. Ele não "entende" quais partes devem ser codificadas, é apenas uma tentativa equivocada de fazer algo (escapando dos URIs completos) que é realmente impossível fazer de forma consistente. Veja esta resposta para uma explicação detalhada.As respostas aqui são muito boas, mas ainda insuficientes para mim.
Eu escrevi um pequeno laço que compara
Uri.EscapeUriString
comUri.EscapeDataString
para todos os caracteres de 0 a 255.NOTA: Ambas as funções possuem a inteligência incorporada de que caracteres acima de 0x80 são codificados primeiro em UTF-8 e depois codificados em porcentagem.
Aqui está o resultado:
EscapeUriString
deve ser usado para codificar URLs, enquantoEscapeDataString
deve ser usado para codificar, por exemplo, o conteúdo de um Cookie, porque os dados do Cookie não devem conter os caracteres'='
e';'
.fonte
Uri.EscapeUriString
, porque é impossível fazer escape de URIs completos de forma consistente. Veja esta resposta para uma explicação detalhada.Há uma versão utilizável do perfil do cliente, classe System.Net.WebUtility, presente no perfil do cliente System.dll. Aqui está o link do MSDN:
WebUtility
fonte
Aqui está um exemplo de envio de uma solicitação POST que codifica corretamente os parâmetros usando o
application/x-www-form-urlencoded
tipo de conteúdo:fonte
Para UrlEncode sem usar System.Web:
mais detalhes: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
fonte
fonte