ejabberd moudle 开发 - http modules(二)

继续上一部分,我们已经可以开发一个简单的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 机器人模块。

你可能感兴趣的:(linux,json,Web,erlang,浏览器)