API RingCloud, всё только начинается
Доброго времени суток. Ранее RingCloud анонсировал запуск REST API, которое позволит нашему продукту интегрироваться с различными CRM-системами. И хотя его разработка еще продолжается, мы рады представить Вашему вниманию первую версию. Под катом мы рассмотрим общую архитектуру данного сервиса, его принцип работы, а так же разберём примеры использования.Когда мы только планировали свой сервис, мы ставили перед собой цели сделать его максимально удобным для интеграции, а такие задачи без достойного API не решить. По этому решили уделить данном сервису как можно больше внимания, построив его максимально надёжным и удобным.
Управление ключами APIДля использования API Вам потребуется уникальный API Key и пароль к нему, для этого идём в свой личный кабинет и в соответствующем разделе создаём ключик
Ключ генерируется автоматически, он состоит из префикса с номером вашего аккаунта и телом самого ключа, для того чтобы скопировать ключ необходимо просто кликнуть ЛКМ на строку с ключом. Пароль так же генерируется автоматически и для его изменения, если он вам покажется слишком простым, нужно нажать на иконку справа. Для каждого ключа необходимо указать права доступа, это сделано для разграничения полномочий между вашими приложениями. Уровни доступа работают по принципу «RO/RW» и позволяют разграничить разрешённые действия.
Описание функций RingCloud API, доступных на данный момент, вы сможете получить на странице документации
Архитектура Данный сервис построен по принципу кластера, с балансировкой нагрузки между нодами обрабатывающими запросы. Так как сервис использует HTTPS, то было решено сместить эту задачу на балансировщик. Ноды, обработав запросы, обращаются к ядру системы включающему в себя сервера VoIP, БД, и cache основанный на Redis.Надо сказать, что Redis у нас очень широко используется во всех узлах RingCloud, мы им очень довольны в плане удобства и быстродействия.В качестве балансировщика и серверов WEB интерфейса мы используем Nginx так как он нас полностью устроил по функционалу и производительности, на нём прекрасно реализован функционал балансировки, он отлично работает с HTTPS, обладает очень удобной конфигурацией.
Примеры использования
Наше API мы разрабатываем опираясь на REST методологию, чтобы максимально упростить использование.Давайте рассмотрим принцип формирования запроса. Все url-адреса API имеют вид:
https://api.ringcloud.ru/<
Наиболее часто используемые коды состояния
Код состояния HTTP Описание 200 Функция успешно выполнена 400 Неправильно переданы параметры. Например, при обновлении данных был указан несуществующий пользователь 403 Не задан ключ API или хэш, ключ API не существует или неверно вычислен хэш 404 Запрашиваемый url или файл не найден 405 Метод не поддерживается — вместо GET использован POST запрос или наоборот 429 Слишком много запросов– достигнуто ограничение на частоту запросов к API 500 Внутренняя ошибка. В идеале не должен возвращаться никогда. На данный момент возможна работа с двумя объектами (ресурсами в терминологии REST): «Пользователи» и «Вызовы». С помощью первого можно создавать пользователей, получать о них информацию и изменять их данные. Второй объект предназначен для работы со звонками. С его помощью можно совершить звонок, а также получить информацию об активных и совершенных вызовах. Далее, существуют определенные ограничения на частоту обращений к нашему API. Давайте поясним используемую нами модель. Во-первых, ограничения считаются отдельно для каждого ключа. Во-вторых, в рамках одного ключа существуют ограничения на однотипные запросы, т.е. запросы с полностью одинаковыми URL-адресами. Например, если у Вас есть только один ключ API, и Вы отправляете в минуту два запроса на изменение внутреннего номера у одного и того же пользователя, то успешно отработает только первый запрос. А вот изменить внутренние номера у двух разных пользователей вполне возможно.
Функции объекта «Пользователи» и временные ограничения
Название
URL-адрес
Ограничение
Получение списка пользователей аккаунта
/v1/users
1 запрос в секунду
Получение информации по конкретному пользователю
/v1/users/
Название
URL-адрес
Ограничение
Получение списка каналов для контекста
/v1/calls/channels
1 запрос в 2 секунды
Получение информации по каналу
/v1/calls/channels/
Для того чтобы сделать звонок на потребуется сотрудник который подключился по SIP к серверу RingCloud с помощью «софтфона» или стационарного SIP телефона, и номер на который будем звонить. При отправке запроса в API система сначала вызывает сотрудника (назовём его абонент А), а затем, только когда сотрудник ответил, набирает номер на который мы планируем совершить звонок, таким образом мы оригинируем вызов между абонентом А и абонентом Б
Рассмотрим небольшой пример обращения на Python к нашему API. Вот как можно позвонить с внутреннего номера, закрепленного за сотрудником с именем 1679728441 на номер 7910123456:
# Импортируем всё что нам потребуется для оригинации вызова import requests import hashlib import json # объявляем переменные с данными в виде строки, которые нам потребуются для работы с RingCloud API
api_key = 'YOUR_API_KEY' password = 'YOUR_PASS'
hash = hashlib.md5(api_key+password).hexdigest () payload = { 'user': '1679728441', 'num': '7910123456' } data = {'params': payload} # Выполняем запрос r = requests.post («https://api.ringcloud.ru/v1/calls? api_key=%s&hash=%s» % (api_key, hash), data=json.dumps (data)) print r.text И тоже самое на PHP: [ 'num' => '7910123456', 'user' => '1679728441' ] ]; $ch = curl_init ($apiUrl); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ch, CURLOPT_POST, true); curl_setopt ($ch, CURLOPT_POSTFIELDS, json_encode ($callData)); $result = curl_exec ($ch); echo $result; /* { «status»: «success», «message»: null, «data»: «Originate successfully queued» } */ ?> Также параллельно с проектом разработки RingCloud API мы разрабатываем библиотеки, позволяющие максимально быстро начать использование его в своих приложениях и сервисах. Пока готова только первая версия библиотеки на PHP она находится здесь
Ну вот вроде бы и всё чем мы хотели с вами поделиться. Актуальную версию документации по нашему API можно найти здесь. В ближайших планах — создание полноценного пакета для Python для работы с нашим API и, конечно же, расширение функционала. Спасибо за внимание.