Eu queria saber se existe alguma API padrão em Java para validar um determinado URL. Quero verificar se a string do URL está correta, ou seja, se o protocolo fornecido é válido, e se uma conexão pode ser estabelecida.
Tentei usar HttpURLConnection, fornecendo a URL e conectando-se a ela. A primeira parte do meu requisito parece ter sido cumprida, mas quando tento executar HttpURLConnection.connect (), a exceção 'java.net.ConnectException: Conexão recusada' é lançada.
Isso pode ser por causa das configurações de proxy? Tentei definir as propriedades do sistema para proxy, mas sem sucesso.
Deixe-me saber o que estou fazendo de errado.
java
validation
url
Keya
fonte
fonte
java url validator
, há de fato algumas questões aqui, como validar o url (olhando para a string) e como verificar se o url está acessível (por meio de uma conexão http, por exemplo).Respostas:
Para o benefício da comunidade, já que este tópico é o principal no Google ao pesquisar por
" validador de url java "
A captura de exceções é cara e deve ser evitada sempre que possível. Se você deseja apenas verificar se sua String é uma URL válida, você pode usar a classe UrlValidator do projeto Apache Commons Validator .
Por exemplo:
fonte
Você precisa criar um
URL
objeto e umURLConnection
objeto. O código a seguir testará o formato do URL e se uma conexão pode ser estabelecida:fonte
new HttpGet(url)
, poderá pegar osIllegalArgumentException
HttpGet(...)
lançamentos se houver um url malformado. EHttpResponse
também atira em você se houver algum problema para obter os dados.A
java.net.URL
classe, na verdade, não é uma boa maneira de validar URLs. nãoMalformedURLException
é lançado em todos os URLs malformados durante a construção. Pegando em não valida URL seja, apenas dizer-tempo ou não a conexão pode ser estabelecida.IOException
java.net.URL#openConnection().connect()
Considere esta parte do código:
..que não lança nenhuma exceção.
Eu recomendo usar alguma API de validação implementada usando uma gramática livre de contexto, ou em uma validação muito simplificada apenas use expressões regulares. No entanto, preciso que alguém sugira uma API superior ou padrão para isso, só recentemente comecei a pesquisar por mim mesmo.
Nota Foi sugerido que,
URL#toURI()
em combinação com o tratamento da exceção,java.net. URISyntaxException
pode facilitar a validação de URLs. No entanto, esse método captura apenas um dos casos muito simples acima.A conclusão é que não existe um analisador de URL java padrão para validar URLs.
fonte
Usando apenas a API padrão, passe a string para um
URL
objeto e converta-a em umURI
objeto. Isso determinará com precisão a validade do URL de acordo com o padrão RFC2396.Exemplo:
fonte
Use
android.webkit.URLUtil
no Android:Nota: É apenas verificar o esquema inicial da URL, não se a URL inteira é válida.
fonte
Existe uma maneira de realizar a validação de URL em estrita conformidade com os padrões em Java, sem recorrer a bibliotecas de terceiros:
O construtor de
URI
verifica seurl
é um URI válido e a chamada paraparseServerAuthority
garante que é um URL (absoluto ou relativo) e não um URN.fonte
URI
chamada do construtor e aparseServerAuthority
chamada valida a URL, nãoparseServerAuthority
sozinha.://
vem depois do host,:
introduz o número da porta, que pode estar vazia de acordo com a sintaxe.//
é uma parte do caminho com um segmento vazio, que também é válido. Se você inserir este endereço em seu navegador, ele tentará abri-lo (mas provavelmente não encontrará o servidor chamadohttps
;)).É importante apontar que o objeto URL trata tanto da validação quanto da conexão. Então, apenas os protocolos para os quais um manipulador foi fornecido em sun.net.www.protocol são autorizados ( arquivo , ftp , gopher , http , https , jar , mailto , netdoc ) são válidos. Por exemplo, tente fazer um novo URL com o protocolo ldap :
Você receberá um
java.net.MalformedURLException: unknown protocol: ldap
.Você precisa implementar seu próprio manipulador e registrá-lo por meio
URL.setURLStreamHandlerFactory()
. Um exagero se você deseja apenas validar a sintaxe da URL, uma expressão regular parece ser uma solução mais simples.fonte
Tem certeza de que está usando o proxy correto como propriedades do sistema?
Além disso, se você estiver usando 1.5 ou 1.6, poderá passar uma instância java.net.Proxy para o método openConnection (). Isso é mais elegante imo:
fonte
Acho que a melhor resposta é do usuário @ b1nary.atr0phy. De alguma forma, eu recomendo combinar o método da resposta b1nay.atr0phy com uma regex para cobrir todos os casos possíveis.
fonte
"((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
( fonte ). A única desvantagem dessa regex é que, por exemplo, "127.0..0.1" e "127.0" são válidos.Obrigado. Abrir a conexão de URL passando o Proxy conforme sugerido por NickDK funciona bem.
No entanto, as propriedades do sistema não funcionam como mencionei anteriormente.
Obrigado novamente.
Atenciosamente, Keya
fonte