Перейти к содержанию

KTB-13 Отправить запрос с параметрами и распарсить ответ

📝 Описание

Настройка непрерывного получения обновлений

Требуется настроить непрерывное получение обновлений (апдейтов) от сервера Telegram и сформировать параметризованный HTTP-запрос. Это позволит приложению постоянно получать новые сообщения и реагировать на них в режиме реального времени.

// видео


Базовый парсинг JSON-ответа

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

Парсинг JSON — это процесс преобразования текста в формате JSON в объекты или структуры данных, которые можно использовать в коде. На данном этапе, для демонстрации процесса, будет использоваться метод поиска необходимых данных по индексам конкретных символов в строке. В дальнейшем планируется применять специальные библиотеки для сериализации и десериализации JSON.

// видео

🗒 Задание

  1. Реализовать HTTP-запрос с параметром offset. Это позволит получать обновления, начиная с определённого идентификатора, и предотвратит получение уже обработанных сообщений.
  2. Распарсить ответ сервера с помощью определения индексов.

❌ Ошибки

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

✏️ Комментарии

⌨️ Решение

import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse

fun main(args: Array<String>) {

    val botToken = args[0]
    var updateId = 0

    while (true) {
        Thread.sleep(2000)

        val updates = getUpdates(botToken, updateId)
        println(updates)

        val startUpdateId = updates.lastIndexOf("update_id")
        val endUpdateId = updates.lastIndexOf(",\n\"message\"")

        if (startUpdateId == -1 || endUpdateId == -1) continue
        println(updates.substring(startUpdateId, endUpdateId))

        val updateIdString = updates.substring(startUpdateId + 11, endUpdateId)
        updateId = updateIdString.toInt() + 1
    }
}

fun getUpdates(botToken: String, updateId: Int): String {
    val urlGetUpdates = "https://api.telegram.org/bot$botToken/getUpdates?offset=$updateId"
    val client: HttpClient = HttpClient.newHttpClient()
    val httpRequest: HttpRequest = HttpRequest.newBuilder().uri(URI.create(urlGetUpdates)).build()
    val response: HttpResponse<String> = client.send(httpRequest, HttpResponse.BodyHandlers.ofString())
    return response.body()
}