Желание использовать данные с внешних сервисов это вполне обычная практика. Так как многие из этих сервисов доступны по HTTP(S) (REST API, например), то в этой статье мы хотим показать простой способ обращения к этим сервисам по cURL и обработку данных в случае, если сервер вернет JSON. Все взаимодействия будут выполняться из диалплана.


ПРОСТОЙ CURL ЗАПРОС

В диалплане Asterisk существует функция CURL, которая позволяет получить содержимое WEB или FTP страницы. Синтаксис запроса следующий:

CURL(url,post-data)
  • url — URL, к которому мы будем выполнять обращение;
  • post-data — по умолчанию будет выполнен GET – запрос. Если в данном параметре будут указаны различные значения, то будет выполнен POST запрос с указанными в переменной данными;

Например:

exten => _X.,1,Set(C_RESULT=${CURL(http://seligerpc.ru/rest?num=84991234567)})

Здесь мы выполним 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(http://seligerpc.ru/rest?num=84991234567)})
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.

Почитайте материал об установке данного модуля по этой ссылке.

exten => _X.,1,Set(C_RESULT=${CURL(http://seligerpc.ru/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
  }
}