«1. Обзор

В этой статье мы собираемся исследовать низкоуровневые операции с сетевым программированием на Java. Мы более подробно рассмотрим URL-адреса.

URL-адрес — это ссылка или адрес ресурса в сети. Проще говоря, код Java, взаимодействующий по сети, может использовать класс java.net.URL для представления адресов ресурсов.

Платформа Java поставляется со встроенной поддержкой сети, включенной в пакет java.net:

import java.net.*;

2. Создание URL

Давайте сначала создадим объект java.net.URL, используя его конструктор и передать строку, представляющую удобочитаемый адрес ресурса:

URL url = new URL("/a-guide-to-java-sockets");

Мы только что создали объект с абсолютным URL. Адрес имеет все части, необходимые для достижения желаемого ресурса.

Мы также можем создать относительный URL; предположим, что у нас есть объект URL, представляющий домашнюю страницу Baeldung:

URL home = new URL("http://baeldung.com");

Далее, давайте создадим новый URL, указывающий на уже известный нам ресурс; мы собираемся использовать другой конструктор, который принимает как существующий URL-адрес, так и имя ресурса относительно этого URL-адреса:

URL url = new URL(home, "a-guide-to-java-sockets");

Теперь мы создали новый URL-адрес объекта URL относительно дома; поэтому относительный URL-адрес действителен только в контексте базового URL-адреса.

Мы можем видеть это в тесте:

@Test
public void givenBaseUrl_whenCreatesRelativeUrl_thenCorrect() {
    URL baseUrl = new URL("http://baeldung.com");
    URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets");
    
    assertEquals("http://baeldung.com/a-guide-to-java-sockets", 
      relativeUrl.toString());
}

Однако, если относительный URL определяется как абсолютный в своих составных частях, то базовый URL игнорируется:

@Test
public void givenAbsoluteUrl_whenIgnoresBaseUrl_thenCorrect() {
    URL baseUrl = new URL("http://baeldung.com");
    URL relativeUrl = new URL(
      baseUrl, "/a-guide-to-java-sockets");
    
    assertEquals("http://baeldung.com/a-guide-to-java-sockets", 
      relativeUrl.toString());
}

Наконец, мы можем создать URL, вызвав другой конструктор, который принимает составные части строки URL. Мы рассмотрим это в следующем разделе после рассмотрения компонентов URL.

3. Компоненты URL

URL состоит из нескольких компонентов, которые мы рассмотрим в этом разделе.

Давайте сначала посмотрим на разделение между идентификатором протокола и ресурсом — эти два компонента разделены двоеточием, за которым следуют две косые черты, т. е. ://.

Если у нас есть URL-адрес, такой как http://baeldung.com, то часть перед разделителем, http, является идентификатором протокола, а следующая за ним — именем ресурса, baeldung.com.

Давайте посмотрим на API, который предоставляет объект URL.

3.1. Протокол

Чтобы получить протокол, мы используем метод getProtocol():

@Test
public void givenUrl_whenCanIdentifyProtocol_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals("http", url.getProtocol());
}

3.2. Порт

Чтобы получить порт, мы используем метод getPort():

@Test
public void givenUrl_whenGetsDefaultPort_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals(-1, url.getPort());
    assertEquals(80, url.getDefaultPort());
}

Обратите внимание, что этот метод извлекает явно определенный порт. Если порт явно не определен, будет возвращено -1.

А поскольку HTTP-связь по умолчанию использует порт 80, порт не определен.

Вот пример, когда у нас есть явно определенный порт:

@Test
public void givenUrl_whenGetsPort_thenCorrect(){
    URL url = new URL("http://baeldung.com:8090");
    
    assertEquals(8090, url.getPort());
}

3.3. Хост

Хост — это часть имени ресурса, которая начинается сразу после разделителя :// и заканчивается расширением доменного имени, в нашем случае .com.

Мы вызываем метод getHost() для получения имени хоста:

@Test
public void givenUrl_whenCanGetHost_thenCorrect(){
    URL url = new URL("http://baeldung.com");
    
    assertEquals("baeldung.com", url.getHost());
}

3.4. Имя файла

Все, что следует после имени хоста в URL-адресе, называется именем файла ресурса. Он может включать как путь, так и параметры запроса или просто имя файла:

@Test
public void givenUrl_whenCanGetFileName_thenCorrect1() {
    URL url = new URL("http://baeldung.com/guidelines.txt");
    
    assertEquals("/guidelines.txt", url.getFile());
}

Предположим, что в Baeldung есть статьи по Java 8 по URL-адресу /articles?topic=java\u0026version=8. Все, что следует после имени хоста, является именем файла:

@Test
public void givenUrl_whenCanGetFileName_thenCorrect2() {
    URL url = new URL("http://baeldung.com/articles?topic=java&version=8");
    
    assertEquals("/articles?topic=java&version=8", url.getFile());
}

3.5. Параметры пути

Мы также можем проверять только параметры пути, в нашем случае это /articles:

@Test
public void givenUrl_whenCanGetPathParams_thenCorrect() {
    URL url = new URL("http://baeldung.com/articles?topic=java&version=8");
    
    assertEquals("/articles", url.getPath());
}

3.6. Параметры запроса

Точно так же мы можем проверить параметры запроса, которые имеют следующий вид: topic=java\u0026version=8:

@Test
public void givenUrl_whenCanGetQueryParams_thenCorrect() {
    URL url = new URL("http://baeldung.com/articles?topic=java<em>&version=8</em>");
    
    assertEquals("topic=java<em>&version=8</em>", url.getQuery());
}

4. Создание URL-адреса с компонентными частями

Поскольку мы рассмотрели различные компоненты URL-адреса и их место при формировании полного адреса к ресурсу мы можем рассмотреть другой метод создания объекта URL путем передачи составных частей.

Первый конструктор принимает протокол, имя хоста и имя файла соответственно:

@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect() {
    String protocol = "http";
    String host = "baeldung.com";
    String file = "/guidelines.txt";
    URL url = new URL(protocol, host, file);
    
    assertEquals("http://baeldung.com/guidelines.txt", url.toString());
}

Помните о значении имени файла в этом контексте, следующий тест должен прояснить его:

@Test
public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect2() {
    String protocol = "http";
    String host = "baeldung.com";
    String file = "/articles?topic=java&version=8";
    URL url = new URL(protocol, host, file);
    
    assertEquals("http://baeldung.com/articles?topic=java&version=8", url.toString());
}

второй конструктор принимает протокол, имя хоста, номер порта и имя файла соответственно:

@Test
public void givenUrlComponentsWithPort_whenConstructsCompleteUrl_
  thenCorrect() {
    String protocol = "http";
    String host = "baeldung.com";
    int port = 9000;
    String file = "/guidelines.txt";
    URL url = new URL(protocol, host, port, file);
    
    assertEquals(
      "http://baeldung.com:9000/guidelines.txt", url.toString());
}

5. Заключение

«В этом руководстве мы рассмотрели класс URL и показали, как использовать его в Java для программного доступа к сетевым ресурсам.

Как всегда, полный исходный код статьи и все фрагменты кода можно найти в проекте GitHub.