Работа с REST API, CURL и JSON из номерного плана Asterisk

Взаимодействие с внешними сервисами по 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
}
}