Взаимодействие с внешними сервисами по REST API значительно расширяет возможности Asterisk. В данной статье я покажу работу с REST API из номерного плана Астериска. В данному примере API доступна по HTTPS и возвращает данные в формате JSON
Простой cURL запрос
В номерном плане Asterisk существует функция CURL, которая позволяет получить содержимое WEB или FTP страницы. Синтаксис запроса следующий:
CURL(url,post-data)
url — URL, к которому мы будем выполнять обращение;
post-data — по умолчанию будет выполнен GET – запрос. Если в данном параметре будут указаны различные значения, то будет выполнен POST запрос с указанными в переменной данными;
Например:
exten => _X.,1,Set(C_RESULT=${CURL(//example.ua/rest?num=380632545547)})
Здесь мы выполним GET запрос по указанному URL, а результат сохраним в переменной C_RESULT.
Использование HTTPS в запросах
Иногда, HTTPS запросы могут не срабатывать, так как удаленная сторона будет проверять наш SSL – сертификат. Если поставить параметр ssl_verifypeer=0
, то такой проверки не будет:
same => n,Set(CURLOPT(ssl_verifypeer)=0)
Далее с помощью функции GotoIf
мы можем определить действие, которое отработает на базе результата cURL:
exten => _X.,1,Set(C_RESULT=${CURL(//example.ua/rest?num=380632545547)})
same => n,GotoIf($["${C_RESULT}" = "1"]?res1:res2)
same => n(res1),Verbose(CURL Result = 1)
same => n,Hangup
same => n(res2),Verbose(CURL Result != 1)
same => n,Hangup
Указанный код отправит GET — запрос на rest, в котором в параметре num передаст номер звонящего (можно указать соответствующую переменную диалплана Asterisk). В случае, если результатом выполнения запроса будет 1, то мы перейдем к выполнению шага res1, а противоположном случае, res2.
res_json для обработки JSON ответов
На самом деле, для API, является обычной практикой возврат ответа в виде JSON. Поэтому необходим инструмент для обработки результатов. Для этого мы воспользуемся модулем res_json из JSON библиотеки, который создан для расширения базовых возможностей диалплана с точки зрения обработки JSON.
Этот модуль не поставляется вместе по установочными файлами Астериск и его нужно устанавливать отдельно.
Как установить модуль res_json в Астериск читайте здесь
exten => _X.,1,Set(C_RESULT=${CURL(//example.ua/rest.json)})
same => n,Set(result=${JSONELEMENT(C_RESULT, result/somefield)})
same => n,GotoIf($["${result}" = "1"]?res1:res2)
same => n(res1),Verbose(CURL Result = 1)
same => n,Hangup
same => n(res2),Verbose(CURL Result != 1)
same => n,Hangup
Для теста, создайте у себя на web – сервере файл rest.json
со следующим содержанием:
{
"result": {
"somefield": 1
}
}