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 .