Um guia para a URL Java
1. Visão geral
Neste artigo, vamos explorar operações de baixo nível com programação de rede Java. We’ll be taking a deeper look at URLs.
Um URL é uma referência ou um endereço para um recurso na rede. E, simplesmente, o código Java que se comunica pela rede pode usar a classejava.net.URL para representar os endereços dos recursos.
A plataforma Java vem com suporte de rede embutido, empacotado no pacotejava.net:
import java.net.*;
2. Criação de um URL
Vamos primeiro criar um objetojava.net.URL usando seu construtor e passando uma String que representa o endereço legível do recurso:
URL url = new URL("/a-guide-to-java-sockets");
Acabamos de criar umabsolute URL object. O endereço possui todas as partes necessárias para alcançar o recurso desejado.
Também podemos criara relative URL; assumindo que temos o objeto URL que representa a página inicial do exemplo:
URL home = new URL("http://example.com");
A seguir, vamos criar um novo URL apontando para um recurso que já conhecemos; vamos usar outro construtor, que pega um URL existente e um nome de recurso relativo a esse URL:
URL url = new URL(home, "a-guide-to-java-sockets");
Agora criamos um novo objeto URLurl relativo ahome; portanto, a URL relativa só é válida no contexto da URL base.
Podemos ver isso em um teste:
@Test
public void givenBaseUrl_whenCreatesRelativeUrl_thenCorrect() {
URL baseUrl = new URL("http://example.com");
URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets");
assertEquals(
"/a-guide-to-java-sockets",
relativeUrl.toString());
}
No entanto, se o URL relativo for detectado como absoluto em suas partes componentes, obaseURL será ignorado:
@Test
public void givenAbsoluteUrl_whenIgnoresBaseUrl_thenCorrect() {
URL baseUrl = new URL("http://example.com");
URL relativeUrl = new URL(
baseUrl, "/a-guide-to-java-sockets");
assertEquals(
"/a-guide-to-java-sockets",
relativeUrl.toString());
}
Finalmente, podemos criar uma URL chamando outro construtor que recebe as partes componentes da string da URL. Abordaremos isso na próxima seção depois de abordar os componentes de URL.
3. Componentes de URL
Um URL é feito de alguns componentes - que exploraremos nesta seção.
Vejamos primeiro a separação entre o identificador de protocolo e o recurso - esses dois componentes são separados por dois pontos seguidos por duas barras, ou seja, ://.
Se tivermos uma URL comohttp://example.com, a parte antes do separador,http, é o identificador do protocolo, enquanto a que segue é o nome do recurso,example.com.
Vamos dar uma olhada na API que o objetoURL expõe.
3.1. O protocolo
Para recuperarthe protocol - usamos o métodogetProtocol():
@Test
public void givenUrl_whenCanIdentifyProtocol_thenCorrect(){
URL url = new URL("http://example.com");
assertEquals("http", url.getProtocol());
}
3.2. O Porto
Para obterthe port - usamos o métodogetPort():
@Test
public void givenUrl_whenGetsDefaultPort_thenCorrect(){
URL url = new URL("http://example.com");
assertEquals(-1, url.getPort());
assertEquals(80, url.getDefaultPort());
}
Observe que esse método recupera a porta definida explicitamente. Se nenhuma porta for definida explicitamente, ela retornará -1.
E como a comunicação HTTP usa a porta 80 por padrão - nenhuma porta está definida.
Aqui está um exemplo em que temos uma porta definida explicitamente:
@Test
public void givenUrl_whenGetsPort_thenCorrect(){
URL url = new URL("http://example.com:8090");
assertEquals(8090, url.getPort());
}
3.3. O hospedeiro
The host é a parte do nome do recurso que começa logo após o separador:// e termina com a extensão do nome de domínio, no nosso caso.com.
Chamamos o métodogetHost() para recuperar o nome do host:
@Test
public void givenUrl_whenCanGetHost_thenCorrect(){
URL url = new URL("http://example.com");
assertEquals("example.com", url.getHost());
}
3.4. O nome do arquivo
O que quer que venha após o nome do host em uma URL é conhecido comofile name of the resource. Pode incluir parâmetros de caminho e consulta ou apenas um nome de arquivo:
@Test
public void givenUrl_whenCanGetFileName_thenCorrect1() {
URL url = new URL("/guidelines.txt");
assertEquals("/guidelines.txt", url.getFile());
}
Supondo que o exemplo tenha java 8 artigos sob a URL/articles?topic=java&version=8. Tudo depois do nome do host é o nome do arquivo:
@Test
public void givenUrl_whenCanGetFileName_thenCorrect2() {
URL url = new URL(
"/articles?topic=java&version=8");
assertEquals("/articles?topic=java&version=8", url.getFile());
}
3.5. Parâmetros do caminho
Também podemos inspecionar apenas os parâmetrosthe path, que em nosso caso é/articles:
@Test
public void givenUrl_whenCanGetPathParams_thenCorrect() {
URL url = new URL(
"/articles?topic=java&version=8");
assertEquals("/articles", url.getPath());
}
3.6. Parâmetros de consulta
Da mesma forma, podemos inspecionarthe query parameters, que étopic=java&version=8:
@Test
public void givenUrl_whenCanGetQueryParams_thenCorrect() {
URL url = new URL("/articles?topic=java&version=8");
assertEquals("topic=java&version=8", url.getQuery());
}
4. Criação de URL com peças de componentes
Como agora examinamos os diferentes componentes da URL e seu lugar na formação do endereço completo do recurso, podemos observar outro método de criação de um objeto da URL passando as partes do componente.
O primeiro construtor usa o protocolo, o nome do host e o nome do arquivo, respectivamente:
@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect() {
String protocol = "http";
String host = "example.com";
String file = "/guidelines.txt";
URL url = new URL(protocol, host, file);
assertEquals("/guidelines.txt", url.toString());
}
Lembre-se do significado do nome do arquivo nesse contexto. O teste a seguir deve esclarecer:
@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect2() {
String protocol = "http";
String host = "example.com";
String file = "/articles?topic=java&version=8";
URL url = new URL(protocol, host, file);
assertEquals("/guidelines.txt", url.toString());
}
O segundo construtor usa o protocolo, o nome do host, o número da porta e o nome do arquivo, respectivamente:
@Test
public void givenUrlComponentsWithPort_whenConstructsCompleteUrl_
thenCorrect() {
String protocol = "http";
String host = "example.com";
int port = 9000;
String file = "/guidelines.txt";
URL url = new URL(protocol, host, port, file);
assertEquals(
"http://example.com:9000/guidelines.txt", url.toString());
}
5. Conclusão
Neste tutorial, cobrimos a classeURL e mostramos como usá-la em Java para acessar recursos de rede programaticamente.
Como sempre, o código-fonte completo do artigo e todos os trechos de código podem ser encontrados emGitHub project.