Сетевые запросы

HERE Technologies предоставляет набор геосервисов, построенных вокруг HTTP-API, где каждый компонент картографической системы (геокодирование, маршрутизация, тайлы, поиск объектов) реализован как сетевой запрос к специализированным конечным точкам. Вся работа с картами в JavaScript-клиенте фактически сводится к управлению потоками запросов, их оптимизации и обработке ответов.


Базовая модель HTTP-взаимодействий

Все сервисы HERE Maps API опираются на REST-принципы:

  • запросы выполняются по HTTPS;
  • данные передаются в формате JSON или бинарных тайлов (MVT, PNG);
  • аутентификация осуществляется через API Key или OAuth-токены;
  • каждый тип геоданных вынесен в отдельный endpoint.

Типичный запрос формируется как обычный HTTP GET:

const url = `https://geocode.search.hereapi.com/v1/geocode?q=Berlin&apiKey=YOUR_API_KEY`;

fetch(url)
  .then(res => res.json())
  .then(data => {
    console.log(data);
  });

Ключевой аспект работы — отсутствие состояния между запросами: сервер не хранит контекст, каждый вызов самодостаточен.


Геокодирование и обратное геокодирование

Геокодирование превращает текстовый запрос в координаты, обратное геокодирование — координаты в адрес.

Прямое геокодирование

const geocode = async (query) => {
  const url = `https://geocode.search.hereapi.com/v1/geocode?q=${encodeURIComponent(query)}&apiKey=API_KEY`;

  const response = await fetch(url);
  const result = await response.json();

  return result.items;
};

Обратное геокодирование

const reverseGeocode = async (lat, lng) => {
  const url = `https://revgeocode.search.hereapi.com/v1/revgeocode?at=${lat},${lng}&apiKey=API_KEY`;

  const res = await fetch(url);
  const data = await res.json();

  return data.items;
};

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


Управление маршрутными запросами

Routing API является наиболее тяжёлым по структуре сетевым вызовом, так как включает несколько этапов вычислений: построение графа, оптимизацию пути, учет дорожных условий.

const getRoute = async (origin, destination) => {
  const url = `https://router.hereapi.com/v8/routes?transportMode=car&origin=${origin}&destination=${destination}&return=summary&apiKey=API_KEY`;

  const res = await fetch(url);
  const data = await res.json();

  return data.routes[0];
};

Ключевые параметры запроса:

  • transportMode — тип транспорта;
  • origin и destination — координаты;
  • return — набор возвращаемых данных (summary, polyline, actions);
  • alternatives — запрос альтернативных маршрутов.

Маршрутизация чувствительна к сетевой задержке, поэтому часто применяется кэширование результатов.


Работа с тайлами карт

Картографические тайлы — основа визуализации. HERE использует растровые и векторные тайлы, загружаемые по схеме XYZ.

Загрузка растрового тайла

const tileUrl = `https://1.base.maps.ls.hereapi.com/maptile/2.1/maptile/newest/normal.day/10/537/384/256/png8?apiKey=API_KEY`;

const img = new Image();
img.src = tileUrl;
document.body.appendChild(img);

Векторные тайлы

Векторные данные требуют дополнительного рендеринга на клиенте через WebGL или Canvas.

const vectorTileUrl = `https://vector.hereapi.com/v2/vectortiles/base/mc/10/537/384/omv?apiKey=API_KEY`;

Особенности сетевой работы с тайлами:

  • высокая параллельность запросов;
  • агрессивное кэширование браузером;
  • необходимость ограничения количества одновременных соединений;
  • зависимость от zoom-level.

Пагинация и обработка больших выборок

Сервисы поиска объектов (POI search) возвращают данные порциями. Управление осуществляется через параметры limit и offset.

const searchPlaces = async (query, offset = 0) => {
  const url = `https://places.ls.hereapi.com/places/v1/discover/search?q=${query}&size=20&offset=${offset}&apiKey=API_KEY`;

  const res = await fetch(url);
  return await res.json();
};

Для обхода всех данных реализуется последовательная пагинация:

  • анализ поля next;
  • повторные запросы;
  • агрегация результатов.

Ограничение частоты запросов

HERE API накладывает лимиты на количество обращений. При превышении возвращается статус 429 Too Many Requests.

Throttling

const throttle = (fn, delay) => {
  let lastCall = 0;

  return (...args) => {
    const now = Date.now();
    if (now - lastCall < delay) return;
    lastCall = now;
    fn(...args);
  };
};

Debouncing для поисковых запросов

const debounce = (fn, delay) => {
  let timeout;

  return (...args) => {
    clearTimeout(timeout);
    timeout = setTimeout(() => fn(...args), delay);
  };
};

Эти техники критичны при интеграции поисковых подсказок и автодополнения.


Обработка ошибок сетевого уровня

Сетевые ошибки делятся на несколько категорий:

  • транспортные (timeout, DNS, CORS);
  • HTTP-ошибки (4xx, 5xx);
  • логические ошибки API (invalid parameters).
const safeFetch = async (url) => {
  try {
    const res = await fetch(url);

    if (!res.ok) {
      throw new Error(`HTTP error: ${res.status}`);
    }

    return await res.json();
  } catch (err) {
    console.error('Network error:', err);
    return null;
  }
};

Для повышения устойчивости применяются:

  • повторные попытки (retry);
  • экспоненциальная задержка;
  • резервные endpoint’ы.

AbortController и управление жизненным циклом запросов

При интерактивных интерфейсах важно отменять устаревшие запросы.

const controller = new AbortController();

fetch(url, { signal: controller.signal })
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Запрос отменён');
    }
  });

// отмена
controller.abort();

Это особенно важно при поиске адресов в реальном времени, когда пользователь вводит текст с высокой скоростью.


Кэширование сетевых ответов

Сетевые запросы к HERE API часто повторяются, особенно для:

  • тайлов карт;
  • популярных маршрутов;
  • геокодированных адресов.

Базовая стратегия кэширования:

const cache = new Map();

const cachedFetch = async (url) => {
  if (cache.has(url)) {
    return cache.get(url);
  }

  const res = await fetch(url);
  const data = await res.json();

  cache.set(url, data);

  return data;
};

Более сложные системы используют:

  • IndexedDB;
  • Service Workers;
  • TTL-кэширование;
  • LRU-алгоритмы.

Параллелизм и агрегация запросов

Для повышения производительности используется параллельная загрузка данных:

const loadMultipleTiles = async (urls) => {
  const requests = urls.map(u => fetch(u).then(r => r.json()));
  return Promise.all(requests);
};

При большом количестве запросов важно учитывать:

  • лимиты браузера на соединения;
  • нагрузку на API;
  • приоритетность ресурсов (тайлы важнее POI).

CORS и браузерные ограничения

HERE API поддерживает CORS, однако при нестандартных запросах могут возникать ограничения:

  • отсутствие заголовка Access-Control-Allow-Origin;
  • блокировка preflight-запросов;
  • ограничения на кастомные headers.

Решение:

  • проксирование через backend;
  • использование server-side API агрегаторов;
  • минимизация нестандартных заголовков.

Формирование сложных сетевых цепочек

Реальные приложения редко используют одиночные запросы. Чаще строятся цепочки:

  1. геокодирование адреса;
  2. получение координат;
  3. запрос маршрута;
  4. загрузка тайлов маршрута;
  5. поиск POI вдоль маршрута.
const pipeline = async (address) => {
  const geo = await geocode(address);
  const coords = geo[0].position;

  const route = await getRoute(`${coords.lat},${coords.lng}`, "52.5200,13.4050");

  return route;
};

Такая модель требует строгого контроля ошибок на каждом этапе, поскольку сбой одного запроса разрушает всю цепочку.


Оптимизация сетевой нагрузки

Ключевые стратегии:

  • сокращение количества запросов через агрегацию;
  • использование batch API (где доступно);
  • предзагрузка тайлов в фоне;
  • приоритизация критических данных;
  • отказ от лишних повторных вызовов.

Дополнительно применяется разделение запросов на:

  • критические (маршрут, геокодирование);
  • второстепенные (POI, подсказки);
  • визуальные (тайлы, стили).

Безопасность сетевых взаимодействий

Основные угрозы:

  • утечка API ключа;
  • превышение квот злоумышленниками;
  • подмена запросов.

Меры защиты:

  • хранение ключей на сервере;
  • ограничение доменов (referrer restriction);
  • мониторинг аномальных запросов;
  • ротация ключей.

Итоговая модель сетевого слоя

Сетевой слой HERE Maps API представляет собой распределённую систему HTTP-вызовов, где каждый тип данных вынесен в отдельный сервис, а клиентская логика строится вокруг:

  • асинхронных запросов;
  • управления конкурентностью;
  • кэширования;
  • обработки ошибок;
  • оптимизации сетевого трафика;
  • координации цепочек запросов между сервисами геоданных.