其实除了mod_verto
外,在FreeSWITCH中很早就有另一个模块可以提供HTTP
Server功能,这就是mod_xml_rpc
。
该模块是最早的HTTP Server功能,在FreeSWITCH Console上执行
load mod_xml_rpc
可以看到类似如下输出:
mod_xml_rpc.c:1242 Starting HTTP Port 8080, DocRoot [/usr/local/freeswitch/htdocs]
表明一个监听8080端口的HTTP Server已经准备好了。
该模块默认使用HTTP
Basic验证,用户名和密码都在xml_rpc.conf.xml
中配置。
用浏览器打开FreeSWITCH服务器的8080端口,输入密码,就进入了一个小型的网站。里面的功能不多,不过,FreeSWITCH自己带了一个小小的FreeSWITCH Portal,这一块在《FreeSWITCH权威指南》里写得很详细,我们就不多说了。
我们来看看它提供的API:
$ curl --user freeswitch:works localhost:8080/api/status
<h1>FreeSWITCH Status</h1>
2015-06-30 18:42:49<br>
UP 0 years, 1 day, 21 hours, 31 minutes, 33 seconds, 325 milliseconds, 220 microseconds<br>
FreeSWITCH (Version 1.7.0 git 2a1195e 2015-06-26 19:51:40Z 64bit) is ready<br>
2 session(s) since startup<br>
0 session(s) - peak 1, last 5min 0 <br>
0 session(s) per Sec out of max 30, peak 1, last 5min 0 <br>
1000 session(s) max<br>
min idle cpu 0.00/100.00<br>
Current Stack Size/Max 240K/8192K
很熟悉吧,跟在Console上执行的结果基本一样。如果你熟悉Curl的话,你就明白以上命令向FreeSWITCH发了一个HTTP请求,并得到了结果。
其实我们完全可以执行更复杂的命令,如
$ curl --user freeswitch:works localhost:8080/api/sofia?status
Name Type Data State
=================================================================================================
192.168.7.6 alias internal ALIASED
external profile sip`mod_sofia`@192.168.7.6:5080 RUNNING (0)
.....
甚至发起一个呼叫,如:
curl --user freeswitch:works "localhost:8080/api/originate?user/1000%20%26echo"
其中,参数经过urlencode处理,经过FreeSWITCH urldecode以后的命令就相当于:
originate usr/1000 &echo
当然,更强大的还在后台,因为,你可以调用Lua
$ curl --user freeswitch:works "localhost:8080/api/lua?/tmp/test.lua"
Hi, 欢迎交流FreeSWITCH-CN微信公众号
对应的Lua脚本内容如下:/tmp/test.lua
stream:write("Hi, 欢迎交流FreeSWITCH-CN微信公众号\n")
有了Lua,就有了无限可能。比方,你可以POST一些参数:
$ curl --user freeswitch:works -XPOST -d "a=1&b=2" "localhost:8080/api/lua?/tmp/test.lua"
Hi, 欢迎交流FreeSWITCH-CN微信公众号, 我收到的参数是 a=1 b=2
对应的Lua脚本是:
a = env:getHeader("a")
b = env:getHeader("b")
stream:write("Hi, 欢迎交流FreeSWITCH-CN微信公众号, 参数是 a=" .. a .. " b=" .. b .. "\n")
大家已经看到,FreeSWITCH会将收到的POST参数存到env
变量里,env
是一个标准的Event变量,可以用getHeader取到参数的值。如果想查看全部的env
变量,可以在脚本中加入以下代码:
stream:write(env:serialize());
你甚至可以POST XML,如:
curl --user freeswitch:works -XPOST -d '<xml><a>100</a><b>200</b></xml>' -H "Content-Type: application/xml" "localhost:8080/api/lua?/tmp/test.lua"
如果你像上面一个使用了stream:write
的话,你就知道怎么取得这段XML字符串了。