Как совершать и принимать телефонные звонки с помощью Spark и Java 8 в IntelliJ

Автор: | 07.08.2026

Веб-приложения на Java могут легко совершать и принимать телефонные звонки, комбинируя веб-фреймворк Spark с Twilio Voice API. В нашем примере телефонные звонки будут воспроизводить фрагмент текста, а затем MP3-файл, но их можно легко модифицировать для выполнения других полезных действий, таких как сбор пользовательского ввода с цифровой клавиатуры или создание конференц-звонков.

Наше веб-приложение на Spark будет использовать Java 8 JDK и Apache Maven, поэтому убедитесь, что эти инструменты установлены. Если вам нужно установить Java 8 и Apache Maven на Windows, ознакомьтесь с этим руководством (можно пропустить разделы, связанные с GWT). Нам также понадобятся следующие инструменты для выполнения этого руководства:

— Веб-фреймворк Spark для обработки HTTP-запросов

— Ngrok для создания туннеля к локальной среде разработки

— Бесплатная учетная запись Twilio для использования Twilio Voice

— Библиотека-помощник Twilio для Java

Весь код для этого руководства можно найти в репозитории java-twilio-example-apps на GitHub. Копируйте и модифицируйте код по своему усмотрению — он полностью открыт под лицензией MIT.

IntelliJ может создать для нас шаблон проекта, а также установить Spark и библиотеку-помощник Twilio для Java.

Запустите IntelliJ и выберите «Create New Project», затем выберите Maven.

Нажмите «Next», затем заполните поля `GroupId`, `ArtifactId` и `Version` на экране нового проекта. Можно оставить значения по умолчанию, как на следующем скриншоте, или использовать свои настройки. Нажмите кнопку «Next». На следующем экране введите `javaCalls` в качестве имени проекта и разместите проект в отдельной подпапке в каталоге, где вы храните свои Java-проекты. Обычно я храню свои проекты в папке `C:\devel\projects`, но вы можете разместить эту папку там, где обычно храните свои проекты. Нажмите кнопку «Finish», и IntelliJ откроет IDE.

Теперь мы готовы установить зависимости проекта через Maven и наконец приступить к кодированию.

Откройте файл `pom.xml` Maven. Добавьте следующие две новые зависимости, выделенные ниже:

Приведенный выше XML-код содержит инструкции для Maven о том, какие зависимости приложения нужно установить. В нашем случае у нас всего две зависимости: одна для Spark и другая для библиотеки-помощника Twilio для Java. Сохраните файл `pom.xml`.

Maven должен автоматически загрузить зависимости. Если этого не произошло, перейдите в «Settings» -> «Build, Execution, Deployment» -> «Build Tools» -> «Maven» -> «Importing» и установите флажок «Import Maven projects automatically».

Наши две необходимые зависимости будут установлены локально, как только Maven завершит выполнение.

Теперь, когда наши зависимости JAR установлены, мы можем написать немного Java-кода.

Наше веб-приложение на Spark будет иметь три конечные точки:

— `/` – возвращает простое текстовое сообщение, чтобы мы знали, что наше приложение Spark работает

— `/twiml` – отвечает TwiML (набор инструкций, написанных в XML), который указывает Twilio, что делать с телефонными звонками

— `/dial-phone/`, где «outbound_phone_number» — это номер телефона в формате «+12025551234»

Создайте новый файл с именем `PhoneCalls.java` в папке `src/main/java` внутри вашего проекта. Впишите следующие строки кода в `PhoneCalls.java`:

Сохраните файл. Нажмите «Build» -> «Build Project» или используйте сочетание клавиш Ctrl-F9 для компиляции и сборки в IntelliJ. Затем нажмите «Run» -> «Run PhoneCalls.java» или используйте Shift-F10 для запуска приложения.

Если IntelliJ выдаст ошибку компиляции с сообщением «Method references are not supported at this language level», нажмите Alt+Enter и выберите «Set language level to 8 – Lambdas, type annotations, etc.» из выпадающего списка. Пересоберите проект, и ошибка должна исчезнуть.

Сервер разработки Spark начнет работу. Если вы увидите предупреждения о «Failed to load class org.slf4j.impl.StaticLoggerBinder», не беспокойтесь об этом сейчас, так как нам не потребуется журналирование.

Протестируйте приложение, перейдя в веб-браузере по адресу http://localhost:4567/. Мы должны получить сообщение об успешном запуске приложения и его готовности отвечать на запросы.

Далее нам нужно приобрести телефонный номер Twilio, который наше приложение Spark сможет использовать для звонков на другие номера.

Наше веб-приложение Spark работает, но на самом деле мы хотим совершать телефонные звонки.

В веб-браузере перейдите на сайт Twilio и зарегистрируйтесь для получения бесплатной учетной записи. Вы также можете войти в свою существующую учетную запись Twilio, если она у вас уже есть.

Пробная учетная запись Twilio позволяет совершать и принимать звонки на ваш собственный подтвержденный номер телефона. Чтобы совершать и принимать звонки с любого номера телефона, необходимо обновить учетную запись. Пробные учетные записи отлично подходят для начальной разработки перед запуском приложения в продакшн, но обновленные учетные записи раскрывают всю мощь Twilio.

После входа в свою учетную запись Twilio перейдите на экран управления телефонными номерами. На этом экране вы можете купить один или несколько телефонных номеров или щелкнуть на существующем номере в своей учетной записи для его настройки.

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

Есть одна проблема с конфигурацией нашей локальной среды разработки: Twilio не сможет получить доступ к маршруту `/twiml`. Нам нужно развернуть наше приложение на доступном сервере или использовать инструмент туннелирования локального хоста, такой как Ngrok. Ngrok предоставляет внешний URL, который подключается к порту, работающему на вашем компьютере. Скачайте и установите приложение Ngrok для вашей операционной системы.

Запустите следующую команду, чтобы сделать наше приложение Spark на порту 4567 общедоступным в Интернете через Ngrok. Вам нужно находиться в той же директории, что и `ngrok.exe`:

Ngrok запустится и предоставит нам URL для переадресации, как с HTTP, так и с HTTPS. Сохраните HTTPS-версию URL для переадресации под рукой, так как мы будем использовать ее в нашем Java-коде через мгновение.

Нам нужно добавить два новых маршрута в наше приложение Spark, чтобы оно могло совершать исходящие звонки. Измените существующий файл `PhoneCalls.java`, добавив две новые лямбда-функции ниже для обработки конечных точек `twiml_response` и `outbound_call`:

URL переадресации плюс маршрут укажут Twilio, как обрабатывать телефонный звонок, когда кто-то ответит. Вставьте URL переадресации Ngrok в файл `PhoneCalls.java` там, где указано `NGROK_BASE_URL`:

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

Убедитесь, что вы заменили указанный выше номер телефона своим номером телефона Twilio. Также измените заполнители в константах `ACCOUNT_SID` и `AUTH_TOKEN`, чтобы ваше приложение могло правильно инициализировать TwilioRestClient.

Остановите ваше приложение Spark. Пересоберите проект, затем запустите приложение Spark, чтобы оно загрузило только что написанный вами код.

Откройте приложение в веб-браузере. Перейдите по адресу «localhost:4567/dial-phone/мой-номер-телефона», где «мой-номер-телефона» — это номер в формате E.164 «+12023350173». Например, вот что происходит, когда я получаю звонок на свой телефон:

Когда мы отвечаем на звонок, мы также видим, что маршрут `/twiml` вызывается через Ngrok. Всего с парой маршрутов Spark и Voice API от Twilio мы смогли заставить телефоны звонить!

Исходящие звонки удобны, но что, если кто-то пропустит наш звонок и перезвонит на этот номер? К счастью, мы уже проделали всю тяжелую работу, чтобы сделать входящие звонки возможными. Нам просто нужно скопировать наш URL переадресации Ngrok плюс конечную точку TwiML в экран конфигурации телефонного номера.

Нажмите «Save» и позвоните на номер вашего приложения со своего мобильного телефона. Вы должны получить то же сообщение и воспроизведение MP3, что и при исходящем звонке.

Теперь мы можем совершать и принимать телефонные звонки из нашего веб-приложения Spark, используя наш номер телефона Twilio. Далее вы можете попробовать добавить еще больше функций в свое приложение, изучив одно из следующих руководств:

— Усовершенствуйте свое приложение Spark, чтобы оно могло отправлять и принимать текстовые сообщения

— Создайте функцию автоматического телефонного опроса

— Настройте уведомления сервера по SMS или телефонным звонкам

Вопросы? Свяжитесь со мной через:

— Twitter: @mattmakai

— GitHub: mattmakai

— Email: makai@twilio.com