Verificando se existe um URL em Java

Verificando se existe um URL em Java

1. Visão geral

Neste tutorial, veremos como verificar se existe um URL com um exemplo em Java usandoGETeHEADHTTP methods.

2. Existência de URL

Pode haver situações na programação em que precisamos saber se um recurso existe no URL fornecido antes de acessá-lo, ou podemos até mesmo precisar verificar um URL para saber a integridade do recurso.

Decidimos a existência de um recurso em um URL, observando seu código de resposta. Normalmentewe look for a 200, which means “OK” and that the request has succeeded.

3. Usando uma solicitação GET

Em primeiro lugar, para fazer uma solicitaçãoGET, podemos criar uma instância dejava.net.URLe passar a URL que gostaríamos de acessar como um argumento do construtor. Depois disso, simplesmente abrimos a conexão e obtemos o código de resposta:

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

Quando o recurso não é encontrado no URL, obtemos um código de resposta404:

URL url = new URL("http://www.example.com/xyz");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);

Comothe default HTTP method in HttpURLConnection is GET, não estamos definindo o método de solicitação nos exemplos desta seção. Veremos como substituir o método padrão na próxima seção.

4. Usando uma solicitação HEAD

O HEAD também é um método de solicitação de HTTP idêntico a GET, exceto que não retorna o corpo da resposta.

Ele adquire o código de resposta junto com os cabeçalhos de resposta que receberemos se o mesmo recurso for solicitado com um método GET.

Para criar uma solicitação HEAD, podemos simplesmente definir o método de solicitação como HEAD antes de obter o código de resposta:

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

Da mesma forma, quando o recurso não for encontrado no URL:

URL url = new URL("http://www.example.com/xyz");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);

By using the HEAD method and thereby not downloading the response body, we reduce the response time and bandwidth, and we improve performance.

Embora a maioria dos servidores modernos suporte o método HEAD,some home-grown or legacy servers might reject the HEAD method with an invalid method type error. So, we should use the HEAD method with caution.

5. Seguindo Redirecionamentos

Finalmente, ao procurar a existência de URL, pode ser uma boa ideia não seguir os redirecionamentos. Mas isso também pode depender do motivo pelo qual estamos procurando o URL.

Quando uma URL é movida, o servidor pode redirecionar a solicitação para uma nova URL com códigos de resposta 3xx. The default is to follow a redirect. Podemos optar por seguir ou ignorar o redirecionamento com base em nossa necessidade.

Para fazer isso, podemos substituir o valor padrão defollowRedirects para todos osHttpURLConnections:

URL url = new URL("http://www.example.com");
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

Ou podemos desativar os seguintes redirecionamentos para uma única conexão usando o métodosetInstanceFollowRedirects():

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setInstanceFollowRedirects(false);

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

6. Conclusão

Neste artigo, analisamos o código de resposta para encontrar a disponibilidade de um URL. Além disso, vimos como seria uma boa ideia usar o método HEAD para economizar largura de banda e obter uma resposta mais rápida.

O exemplo de código usado neste tutorial está disponível em nossoGitHub project.