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 относительно home ; таким образом, относительный 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-адрес обнаружен как абсолютный в его составных частях, то baseUrl игнорируется:
@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&version=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. Параметры пути
Мы также можем проверять только путь параметры, которые в нашем случае являются /статьями :
@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&version=8 :
@Test public void givenUrl_whenCanGetQueryParams_thenCorrect() { URL url = new URL("http://baeldung.com/articles?topic=java&version=8"); assertEquals("topic=java&version=8", 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 .