Руководство по Java URL

Руководство по Java URL

1. обзор

В этой статье мы собираемся исследовать низкоуровневые операции с сетевым программированием на Java. We’ll be taking a deeper look at URLs.с

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

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

import java.net.*;

2. Создание URL

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

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

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

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

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

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

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

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

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

@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());
}

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

@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());
}

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

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

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

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

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

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

3.1. Протокол

Чтобы получитьthe protocol - мы используем методgetProtocol():

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

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

3.2. Порт

Чтобы получитьthe port - воспользуемся методомgetPort():

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

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

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

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

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

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

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

3.3. Гостья

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

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

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

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

3.4. Имя файла

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

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

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

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

@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. Параметры пути

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

@Test
public void givenUrl_whenCanGetPathParams_thenCorrect() {
    URL url = new URL(
      "/articles?topic=java&version=8");

    assertEquals("/articles", url.getPath());
}

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

Точно так же мы можем проверитьthe query parameters, который равен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. Создание URL с составными частями

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

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

@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());
}

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

@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());
}

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

@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. Заключение

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

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