Настройка инициализатора Vonage для Rails с помощью vonage-rails

Источник: Vonage API Developer•

Настройка инициализатора Vonage для Rails с помощью vonage-rails

Используйте гем vonage-rails для создания инициализатора Rails, который запускает глобальный клиент Vonage при старте приложения — это подход, соответствующий лучшим практикам.

Если у Rails и есть основополагающая религия, то это «соглашение важнее конфигурации». Одна из её самых строгих заповедей: держите контроллеры «тонкими». Действие контроллера должно получать запрос, координировать ответ и не мешать. Оно не должно отвечать за создание экземпляра и настройку API-клиента. Это отдельная задача, и её смешивание нарушает принцип единственной ответственности (Single Responsibility Principle), на котором строится архитектура Rails.

Поэтому вы можете делать это снова и снова по всему коду:

Гем vonage-rails решает эту проблему в стиле Rails: одна команда генератора создает инициализатор в config/initializers/, запускает глобальный клиент Vonage при старте и не мешает вашим контроллерам.

В этом руководстве рассматривается настройка инициализатора Rails с помощью гема vonage-rails, конфигурирование учетных данных с помощью переменных окружения и создание рабочего эндпоинта, который отправляет текстовое сообщение через Vonage Messages API, демонстрируя, как инициализаторы Rails позволяют вынести настройку SDK из контроллеров в правильное место.

TL;DR Пример кода на GitHub

TL;DR Пример кода на GitHub

Предварительные требования

Перед началом убедитесь, что у вас есть:

  • Установленный Ruby 3.x (проверьте с помощью ruby -v)

Установленный Ruby 3.x (проверьте с помощью ruby -v)

  • Rails 6.1 или новее

Rails 6.1 или новее

  • Учетная запись Vonage с приложением Vonage, идентификатором приложения и закрытым ключом

Учетная запись Vonage с приложением Vonage, идентификатором приложения и закрытым ключом

Если вы еще не создали приложение Vonage, перейдите в панель управления Vonage, создайте новое приложение и включите возможность Messages. При появлении запроса сгенерируйте пару открытого/закрытого ключей и загрузите файл закрытого ключа. Держите их под рукой. Они скоро вам понадобятся.

При создании приложения Vonage панель управления запросит у вас URL-адреса для входящих сообщений и статусов вебхуков. Пока используйте значения-заполнители (например, https://example.com/webhooks/inbound и https://example.com/webhooks/status). Вы сможете обновить их на реальные URL-адреса после развертывания приложения.

  • Чтобы создать приложение, перейдите на страницу Создание приложения в панели управления Vonage и укажите имя для вашего приложения.

Чтобы создать приложение, перейдите на страницу Создание приложения в панели управления Vonage и укажите имя для вашего приложения.

  • Если вы планируете использовать API, который работает с вебхуками, вам понадобится закрытый ключ. Нажмите «Generate public and private key», загрузка должна начаться автоматически. Храните его в безопасности; этот ключ нельзя будет загрузить повторно, если он будет утерян. Он будет следовать соглашению об именовании private_<ваш id приложения>.key. Этот ключ теперь можно использовать для аутентификации вызовов API. Примечание: ваш ключ не будет работать, пока приложение не будет сохранено.

Если вы планируете использовать API, который работает с вебхуками, вам понадобится закрытый ключ. Нажмите «Generate public and private key», загрузка должна начаться автоматически. Храните его в безопасности; этот ключ нельзя будет загрузить повторно, если он будет утерян. Он будет следовать соглашению об именовании private_<ваш id приложения>.key. Этот ключ теперь можно использовать для аутентификации вызовов API. Примечание: ваш ключ не будет работать, пока приложение не будет сохранено.

  • Выберите необходимые возможности (например, Voice, Messages, RTC и т. д.) и укажите требуемые вебхуки (например, URL-адреса событий, URL-адреса ответов или URL-адреса входящих сообщений). Они будут описаны в руководстве.

Выберите необходимые возможности (например, Voice, Messages, RTC и т. д.) и укажите требуемые вебхуки (например, URL-адреса событий, URL-адреса ответов или URL-адреса входящих сообщений). Они будут описаны в руководстве.

  • Чтобы сохранить и развернуть, нажмите «Generate new application» для завершения настройки. Ваше приложение теперь готово к использованию с API Vonage.

Чтобы сохранить и развернуть, нажмите «Generate new application» для завершения настройки. Ваше приложение теперь готово к использованию с API Vonage.

Создание нового Rails API приложения

Начните с чистого Rails API приложения:

Флаг --api делает проект легким, удаляя представления и промежуточное ПО браузера, которые не понадобятся для бэкенд-сервиса обмена сообщениями.

Добавление гема

Откройте Gemfile в редакторе и добавьте:

Обратите внимание на подчеркивание в vonage_rails — имя гема в Gemfile использует подчеркивания, а не дефисы. Сохраните файл, затем выполните:

Посмотреть на GitHub: Gemfile

vonage_rails поставляется с dotenv-rails в качестве зависимости времени выполнения, поэтому он устанавливается автоматически. Стоит знать: поскольку это зависимость времени выполнения (не ограниченная :development или :test), файлы .env будут загружаться во всех средах, включая production. В production предпочтительнее устанавливать переменные окружения напрямую через менеджер секретов или конфигурацию вашей платформы, а не полагаться на файл .env.

Настройка переменных окружения

Поместите файл закрытого ключа в корень проекта. Затем создайте файл .env в корне:

Посмотреть на GitHub: .env.example

Замените your_application_id_here на идентификатор приложения из панели управления Vonage и убедитесь, что private.key совпадает с именем загруженного вами файла. Замените 447700900000 на виртуальный номер Vonage, привязанный к вашему приложению Vonage.

Примечание: значение для VONAGE_PRIVATE_KEY — это путь к файлу вашего закрытого ключа, а не содержимое ключа. Vonage.setup считывает файл автоматически.

Перед тем как делать коммит, добавьте оба файла в .gitignore:

Посмотреть на GitHub: .gitignore

Запуск генератора инициализатора

После установки гема запустите генератор:

Это создаст файл config/initializers/vonage.rb.

Сгенерированный файл

Откройте файл, и вы увидите блок Vonage.setup с пятью явными обращениями к ENV:

Как это работает

При загрузке Rails загружает инициализатор, вызывает Vonage.setup и настраивает модуль Vonage. Гем использует модуль Ruby Forwardable для делегирования каждого вызова метода в Vonage базовому экземпляру Vonage::Client. Константа Vonage — это сам модуль, а не переназначенный экземпляр клиента, поэтому Vonage.messaging, Vonage.voice и остальные работают корректно.

С этого момента любой контроллер, сервис или фоновая задача имеют доступ ко всем API, поддерживаемым Ruby SDK, через ту же константу Vonage:

Константа

API

Vonage.messaging

Messages API (SMS, MMS, WhatsApp, RCS)

Vonage.voice

Voice API

Vonage.verify

Verify API

Vonage.numbers

Numbers API

Vonage.number_insight

Number Insight API

Vonage.account

Account API

Vonage.applications

Applications API

Vonage.conversations

Conversation API

Vonage.subaccounts

Subaccounts API

Vonage.redact

Redact API

Vonage.sms

SMS API (устаревший)

В этой таблице показан часто используемый набор. Ruby SDK в настоящее время предоставляет в общей сложности 29 делегированных пространств имен. Делегирование настраивается один раз при загрузке гема для Vonage::Client.instance_methods(false). Когда SDK добавляет новый API, он становится доступным через Vonage после выполнения bundle update vonage и перезапуска сервера.

Создание эндпоинта

После настройки инициализатора подключите контроллер и маршрут.

Создайте контроллер:

Это создаст файл контроллера, а также добавит get "messages/create" в config/routes.rb. Замените все содержимое config/routes.rb на правильный POST-маршрут:

Посмотреть на GitHub: config/routes.rb

Теперь обновите действие контроллера для отправки текстового сообщения с использованием глобальной константы Vonage:

Посмотреть на GitHub: app/controllers/messages_controller.rb

Успешный ответ Messages API содержит message_uuid. Если это поле присутствует, сообщение было принято к доставке. Обработка ошибок сбоев сети и ошибок API здесь опущена для краткости; полный репозиторий включает более полную реализацию.

Запустите сервер:

В новом окне терминала отправьте тестовый запрос. Параметр to — это реальный мобильный номер получателя в формате E.164, на который вы хотите отправить сообщение:

При указании действительных учетных данных вы получите {"status":"sent","message_uuid":"..."} и текстовое сообщение на номер получателя.

Полезно знать

Тестирование

Вам не нужно выполнять реальные вызовы API во время тестов. Сначала добавьте rspec-rails в ваш Gemfile:

Затем выполните:

Заглушите константу Vonage на уровне метода с помощью тестового дублера:

Это обеспечивает быстроту набора тестов, избавляет от необходимости указывать учетные данные в CI и позволяет сосредоточить проверки на поведении контроллера.

Примечание: Убедитесь в соответствии Vonage::Messaging установленной версии SDK перед использованием instance_double. Если имя класса отличается, RSpec немедленно сообщит о несоответствии.

Примечание: Убедитесь в соответствии Vonage::Messaging установленной версии SDK перед использованием instance_double. Если имя класса отличается, RSpec немедленно сообщит о несоответствии.

API Key и Secret

Не всем API Vonage требуются API key и secret. Messages API использует JWT-аутентификацию (ваш идентификатор приложения и закрытый ключ), поэтому в данном случае можно оставить эти переменные окружения (ENV) не заданными. Для API, которым они требуются, обратитесь к документации Vonage API и добавьте их в файл .env при необходимости.

Vonage.messaging.send затеняет Object#send

Такова собственная архитектура SDK, и она работает, но это удивляет разработчиков при первом знакомстве. Vonage.messaging.send(...) — это не встроенный в Ruby метод Object#send. Это эндпоинт отправки Vonage Messages API, представленный в виде метода Ruby. Если вы выполняете отладку и пытаетесь вызвать метод динамически с помощью Object#send, используйте вместо него public_send во избежание конфликта.

Несколько клиентов Vonage

Константа Vonage представляет собой один настроенный экземпляр. Если вашему приложению требуется два отдельных клиента, например один для обмена сообщениями, а другой для другого приложения Vonage с отдельными учетными данными, определите вторую именованную константу в том же инициализаторе. Поскольку Vonage.setup выполняет разрешение путей File.exist?, а чистый Vonage::Client.new — нет, при обходе метода setup вам необходимо передавать содержимое ключей напрямую:

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

Заключение

Гем vonage-rails отлично справляется с одной задачей: он размещает настройку клиента Vonage там, где ей положено быть — в инициализаторе, который запускается один раз при загрузке. Ваши учетные данные остаются в окружении, контроллеры сосредоточены на логике приложения, а любой API Vonage доступен через вызов одного метода из любой точки приложения.

О чём эта статья

Ещё в разделе «Телеком и сети»

Все →

Ещё от Vonage API Platform