Перейти к основному содержимому

Руководство по URL-адресу Java

· 5 мин. чтения

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, представляющий домашнюю страницу ForEach:

URL home = new URL("http://foreach.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://foreach.com");
URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets");

assertEquals("http://foreach.com/a-guide-to-java-sockets",
relativeUrl.toString());
}

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

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

assertEquals("http://foreach.com/a-guide-to-java-sockets",
relativeUrl.toString());
}

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

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

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

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

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

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

3.1. Протокол

Для получения протокола — используем метод getProtocol() :

@Test
public void givenUrl_whenCanIdentifyProtocol_thenCorrect(){
URL url = new URL("http://foreach.com");

assertEquals("http", url.getProtocol());
}

3.2. Порт

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

@Test
public void givenUrl_whenGetsDefaultPort_thenCorrect(){
URL url = new URL("http://foreach.com");

assertEquals(-1, url.getPort());
assertEquals(80, url.getDefaultPort());
}

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

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

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

@Test
public void givenUrl_whenGetsPort_thenCorrect(){
URL url = new URL("http://foreach.com:8090");

assertEquals(8090, url.getPort());
}

3.3. Гостья

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

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

@Test
public void givenUrl_whenCanGetHost_thenCorrect(){
URL url = new URL("http://foreach.com");

assertEquals("foreach.com", url.getHost());
}

3.4. Имя файла

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

@Test
public void givenUrl_whenCanGetFileName_thenCorrect1() {
URL url = new URL("http://foreach.com/guidelines.txt");

assertEquals("/guidelines.txt", url.getFile());
}

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

@Test
public void givenUrl_whenCanGetFileName_thenCorrect2() {
URL url = new URL("http://foreach.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://foreach.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://foreach.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 = "foreach.com";
String file = "/guidelines.txt";
URL url = new URL(protocol, host, file);

assertEquals("http://foreach.com/guidelines.txt", url.toString());
}

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

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

assertEquals("http://foreach.com/articles?topic=java&version=8", url.toString());
}

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

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

assertEquals(
"http://foreach.com:9000/guidelines.txt", url.toString());
}

5. Вывод

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

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