FreeSWITCH非权威指南 —— mod_curl

mod_curl

About

这个应用可以让你在dialplan中做HTTP请求并接收返回。返回可以是plain text或json对象

Setup & Configuration

为了使用mod_curl,你可以通过编辑modules.conf,去掉对应的注释来编译此模块

1
#applications/mod_curl

重新编译FreeSWITCH

1
2
make
make install

HBSpy: 这里应该不需要这么麻烦,去掉注释后 make mod_curl-install 即可

编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf使该模块在启动时加载

1
<load module="mod_curl"/>

此模块没有其它单独的配置文件

mod_curl提供了以下两个功能的API和dialplan APP

  • curl - 可以用之向WEB服务器发起任意的请求
  • curl_sendfile - 可以用之向WEB服务器/REST传输任意长数据,并接收可选返回

Application

curl APP的语法是这样的

1
<action application="curl" data="url [headers|json] [get|head|post [url_encode_data]]"/>

curl APP会设置curl_response_data和curl_response_code两个变量。如果需要,curl_response_data也可以是headers/body或者json的

1
2
3
4
5
6
<action application="curl" data="http://www.google.com"/>
<action application="info"/>
<action application="curl" data="http://www.google.com headers"/>
<action application="info"/>
<action application="curl" data="http://www.google.com json"/>
<action application="info"/>

curl_sendfile有如下两种语法

1
<action application="curl_sendfile" data="<url> <filename_post_name=/path/to/filename [nopost|foo1=bar1&foo2=bar2&...fooN=barN [event|none [uuid|identifier]]]"/>

或者像这样使用通道变量

1
2
3
4
5
6
7
<action application="set" data="curl_sendfile_report=event"/>
<action application="set" data="curl_sendfile_url=http://www.mydomain.com/test_files.php"/>
<action application="set" data="curl_sendfile_filename_element=myFile"/>
<action application="set" data="curl_sendfile_filename=/tmp/somefile.dmp"/>
<action application="set" data="curl_sendfile_extrapost=foo1=bar1&foo2=bar2&testing=a%20pain%20in%20the%20rear"/>
<action application="set" data="curl_sendfile_identifier=1234567890"/>
<action application="curl_sendfile"/>

url, filename, extrapost这些通道变量需要urlencode,data="“字段也是。如果调用此APP时,在data=”"字段里提供了全部的请求参数,你必须指定’nopost’来继续使用data line中其它的参数。如果你指定’uuid’作为identifier,此APP会自动的使用此session的uuid作为这个值。

HBSpy: 'nopost’这里的意思是说要使用[event|none [uuid|identifier]]啥的就不能让前面这儿空着,如果没有请求参数就写nopost。感觉是个常识

CLI / API

在CLI中调用此API,语法是这样的

1
curl url [headers|json|content-type <mime-type>|connect-timeout <seconds>|timeout <seconds>] [get|head|post|delete|put [data]]
1
[api/bgapi] curl_sendfile <url> <filenameParamName=filepath> [nopost|postparam1=foo&postparam2=bar... [event|stream|both|none  [identifier ]]]

HBSpy: 原文中的这些例子就忽略了,都比较简单

总结

如果你不喜欢ESL,或是需要与CTI交互的信息不多,那么mod_curl就是一个非常好的方式

把IVR与mod_curl相结合,就可以写出简单的自助信息查询等功能了

如果使用ESL,那么其实并不建议与ESL混用,在FS中想实现一个功能通常有许多种方式,在一个项目中使用统一的方式通常能够带来维护上的便利。