继续上一部分,我们已经可以开发一个简单的ejabberd module了,这次让我们开发一个简单的http处理模块。这个http模块可以输出服务器中登录的用户列表(json格式)。
首先,再我们上节的my_module中添加一个process/2导出函数:
-module(mod_http_hello_world).
-author('[email protected]').
-vsn('1.0').
-define(EJABBERD_DEBUG, true).
-behavior(gen_mod).
-export([
start/2,
stop/1,
process/2
]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("ejabberd_http.hrl").
start(_Host, _Opts) ->
ok.
stop(_Host) ->
ok.
process(_Path, _Request) ->
"Hello World".
process/2用来处理ejabberd http服务器中的请求,其中第一个参数Path表示url中的路径,比如
http://example.com/this/cool/article 这个URL如果要我们的模块处理,对应的Path为:["this", "cool", "article"],对了,就是路径拆分后的一个list。这里我们先不对路径做任何处理,匹配,我们首先验证我的http handler module是否可以工作。
老规矩,编译module,然后放到ejabbered的ebin目录:
mv mod_http_hello_world.beam /var/lib/ejabberd/ebin
配置ejabberd.cfg,添加我们的module
{modules,
[
{mod_register, [{access, register}]},
…
{mod_http_hello_world, []} % []mod_http_hello_world:start/2中的第二个参数
]}.
到这里步骤和jabberd moudle 开发(一)中,基本相似,可是我们要让我们的module处理http请求,那么我们需要继续下面的配置,打开ejabberd.cfg,找到:
{5280, ejabberd_http, [http_poll, web_admin]}
修改如下:
{5280, ejabberd_http, [http_poll, web_admin,
{request_handlers, [{["hello_world"], mod_http_hello_world}
]}]}
好了,重启ejabberd,在浏览器中输入:
http://example.com:5280/hello_world
页面会显示Hello World,一切正常。
我们开头说过我们的http module要把当前服务器中所有登录的用户打印出来。让我们修改一下process/2函数:
process(_Path, _Request) ->
[Username ++ "@" ++ Server || {Username, Server} <- ejabberd_auth:dirty_get_registered_users()].
我们通过ejabberd_auth:dirty_get_registered_users/0获取用户列表,随后显示出来。
_Request包含请求的方法,路径,参数,post数据,认证的信息,可以更好的处理HTTP 请求。
最后说明一下我们这个modoule是如何被ejabberd执行的,毫无疑问,通过我们对ejabberd_http部分的配置,ejabber 加载了新的http 处理模块,在其ejabberd_http.erl中,当收到http请求时,其遍历所有的http module,找到Path匹配的Moudle,然后执行Module:process/2函数,从而做到http 请求的分发。如果没有找到合适的handler,那么将调用ejabberd_web:error(not_found)。
下节我们开发一个XMPP 机器人模块。