Веб-приложения на 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