JavaRush /Курсы /JAVA 25 SELF /Учимся работать с API и следим за МКС

Учимся работать с API и следим за МКС

JAVA 25 SELF
12 уровень , 5 лекция
Открыта

1. Введение

Сегодня почти любое современное приложение использует данные из интернета. Когда вы открываете погоду в телефоне, заказываете такси или читаете новости — это всегда результат работы с API. Программы «разговаривают» друг с другом, обмениваются сообщениями, и чаще всего эти сообщения выглядят в виде простого текста — формата JSON.

JSON (JavaScript Object Notation) стал стандартом для обмена данными между сервисами. Его любят и программисты, и машины: человек легко прочитает текст, а программа легко его разберёт. В JSON всего несколько правил:

  • данные хранятся как объекты-словари { "ключ": значение },
  • как массивы [значение1, значение2],
  • или как простые строки, числа, булевы значения и null.

Например, вот так может выглядеть JSON-объект, описывающий человека:

{
  "name": "Alice",
  "age": 25,
  "skills": ["Java", "Python", "SQL"]
}

Мы видим ключи (name, age, skills) и их значения. Компактно, наглядно и универсально.

2. Знакомство с API

API (Application Programming Interface) — это «договор» или «контракт», который говорит: если ты обратишься по определённому адресу в интернете и укажешь такие-то параметры, я верну тебе ответ в согласованном формате.

Адрес, по которому мы стучимся для получения данных, называется endpoint. Это просто URL. Часто в нём указываются параметры запроса — так называемые query-параметры.

Например, вот такой URL возвращает прогноз погоды для Минска:

https://api.open-meteo.com/v1/forecast?latitude=50.45&longitude=30.52&current_weather=true

Если присмотреться, то после знака ? перечислены параметры:

  • latitude = 50.45 — широта,
  • longitude = 30.52 — долгота,
  • current_weather = true — хотим текущую погоду.

Некоторые API требуют ещё и специальный «пароль» — ключ API. Тогда его добавляют в параметры, например & apikey = ВАШ_КЛЮЧ.

Документацию сервиса с погодой можно посмотреть на сайте open-meteo.com.

3. Как выглядит ответ API?

Когда мы делаем запрос, сервер отвечает нам текстом: JSON-строкой. Иногда это JSON-объект, иногда — JSON-массив.

Пример ответа о погоде:

{
  "latitude": 50.45,
  "longitude": 30.52,
  "current_weather": {
    "temperature": 21.3,
    "windspeed": 5.2,
    "weathercode": 1
  }
}

Пример ответа сервиса с координатами МКС:

{
  "timestamp": 1717590000,
  "iss_position": {
    "latitude": "48.1234",
    "longitude": "12.5678"
  },
  "message": "success"
}

4. Первый пример: получаем погоду

Попробуем написать маленький фрагмент кода, который обратится к бесплатному API погоды open-meteo.com и просто выведет ответ в консоль.

String url = "https://api.open-meteo.com/v1/forecast?latitude=50.45&longitude=30.52&current_weather=true";

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());

System.out.println("HTTP статус: " + resp.statusCode());
System.out.println("Ответ сервера:");
System.out.println(resp.body());

Здесь мы:

  1. Создаём HttpClient-клиент.
  2. Формируем GET-запрос (HttpRequest).
  3. Отправляем его: client.send.
  4. Получаем ответ в виде строки: HttpResponse<String>.

Если всё работает, вы увидите HTTP-статус 200 и JSON с погодой.

5. Второй пример: следим за МКС

Теперь обратимся к API open-notify.org, которое в реальном времени показывает координаты Международной космической станции (ISS).

String url = "http://api.open-notify.org/iss-now.json";

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());

System.out.println(resp.body());

Результат будет выглядеть так:

{
  "timestamp": 1717590000,
  "iss_position": {
    "latitude": "48.1234",
    "longitude": "12.5678"
  },
  "message": "success"
}

Прямо сейчас вы получили точные координаты станции, которая летает над Землёй. Если запустить этот код снова через минуту — числа будут уже другими.

6. Полезные нюансы

Когда вы начинаете работать с API, очень важно учитывать несколько вещей.

Во-первых, всегда смотрите на статус ответа: resp.statusCode(). Если это 200 — всё хорошо. Если 404 — значит, адрес неправильный. Если 401 — нужен ключ. Если 429 — вы делаете слишком много запросов.

Во-вторых, помните о лимитах. Бесплатные сервисы ограничивают частоту запросов, чтобы никто не перегружал их серверы.

В-третьих, JSON не всегда будет выглядеть красиво. Иногда это длинная строка в одну линию — это нормально. Позже мы научимся подключать библиотеки (Jackson, Gson), чтобы «разбирать» JSON на поля и работать с ними как с объектами.

Ещё один маленький эксперимент

Возьмём API, которое отдаёт случайный факт о кошках:

String url = "https://catfact.ninja/fact";

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());

System.out.println(resp.body());

Запустите этот фрагмент несколько раз, и вы каждый раз будете получать новый JSON с каким-нибудь фактом.

1
Задача
JAVA 25 SELF, 12 уровень, 5 лекция
Недоступна
Получение и вывод JSON-ответа о погоде
Получение и вывод JSON-ответа о погоде
1
Задача
JAVA 25 SELF, 12 уровень, 5 лекция
Недоступна
Получение и вывод статуса ответа от API
Получение и вывод статуса ответа от API
1
Задача
JAVA 25 SELF, 12 уровень, 5 лекция
Недоступна
Получение случайного факта о кошках
Получение случайного факта о кошках
1
Задача
JAVA 25 SELF, 12 уровень, 5 лекция
Недоступна
Получение и вывод координат МКС из JSON-ответа
Получение и вывод координат МКС из JSON-ответа
1
Опрос
Следим за МКС, 12 уровень, 5 лекция
Недоступен
Следим за МКС
Следим за МКС
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anna Klushkina Уровень 60
13 июня 2026
⛏️ Очень хорошая лекция, и много задач!
KEN Уровень 13
7 июня 2026
Это продолжение поста ниже... сначала прочитай его.

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
Что здесь происходит? По порядку. Теперь нам нужно отправить запрос и принять ответ. Эта строчка как раз этим и занимается client.send(req, BodyHandlers). Здесь наша переменная client, которую мы создали ранее, мы к ней применяем метод .send(req, BodyHandlers), который на вход принимает два параметра, наш подготовленный запрос, который мы подготовили ранее и обработчик. И установит связь с сервером и отправит запрос и получит ответ. Обработчик примет ответ от сервера - байты и переделает их в строку. Мы просто говорим ему что хотим данные в виде строки вот так .ofString(). Теперь все это помещается в переменную resp.

System.out.println(resp.body());
Здесь мы применяем метод .body() к нашей переменной resp, для того что бы получить только тело ответа, а не весь ответ. Надеюсь я кому то помог разобраться!
KEN Уровень 13
7 июня 2026
Сложно, но не невозможно. ООП не простоя тема, когда не разу не касался её. Давайте по шажочкам попробуем разобраться, что здесь вообще происходит: Нам нужно создать запрос, что бы отправить его на сервер и получить ответ. 1. Для того что бы отправить запрос нам нужен объект класса, что бы мы смогли применить к нему метод .send(). Вот в самом начале мы и создаем такой объект:

HttpClient client = HttpClient.newHttpClient();
2. Теперь нам нужно подготовить сам запрос. В JAVA есть такие инструменты по умолчанию:

HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
Давайте разберемся что здесь происходит: в JAVA есть статический метод, статический значит, что он не требует создания экземпляра класса, что бы его вызвать .newBuilder(), этот метод принимает на вход параметры, то есть URI, то есть это выглядит так .newBuilder(URI), но что бы вызвать этот метод нужно написать так:

HttpRequest.newBuilder(URI)
URI это преобразованный URL, что это значит? Что URL строка "http://api.open-notify.org/iss-now.json" будет разобрана по частям, то есть http отдельно, api.open-notify.org отдельно, iss-now.json отдельно. Вот здесь мы это и делаем:

URI.create(url)
Теперь наш URL, так скажем в понятном формате для JAVA, метод .create() принял на вход нашу переменную со строкой - адресом "http://api.open-notify.org/iss-now.json" и теперь мы применяем к URI, там находится наше преобразованная строка, метод .GET() - то есть мы говорим, что мы хотим получить данные от сервера и теперь ко всему этому мы применяем метод .build() то есть собираем весь запрос в одну кучу так сказать. Теперь наш запрос кладем в переменную req, тип данных у неё HttpRequest, наш запрос готов, теперь нам нужно наш запрос отправить
Anonymous #3628287 Уровень 54
25 мая 2026
Очень радует, что дали много задач!!!
Victor Уровень 23
27 апреля 2026
Получение случайного факта о кошках: вот сайт для получения случайных фактов о кошках на русском языке: "https://meowfacts.herokuapp.com/?lang=rus"
Victor Уровень 23
27 апреля 2026
Получение и вывод статуса ответа от API: url "https://api.wheretheiss.at/v1/satellites/25544" более стабильный - всегда отвечает
Ilya Pozdnyakov Уровень 13
18 марта 2026
Паралелльно учу QA, это очень годный и полезный материал.
O. Z. Уровень 13
9 февраля 2026
Код с запросом на МКС из учебника выдал бесконечный цикл. Почему?
САН САНЫЧ Уровень 20
27 декабря 2025
все норм!Идем дальше!
nastya_zhadan Уровень 66
19 сентября 2025
Очень понравился этот бонусный уровень