Не могу понять, как извлечь данные публикации из обработчика HTTP-запросов ejabberd

Я пытаюсь познакомиться с эджаббердом и эрлангом ...

Первое, что я не хочу делать, это реализовать свой собственный набор вызовов REST для управления ejabberd с другого сервера.

например для этого запроса:

POST /custom/register HTTP/1.1
Host: some.server.com:8088
Cache-Control: no-cache

{"username":"user","host":"test.com","password":"pass1"}

Я хочу зарегистрировать нового пользователя Jabber, поэтому я создал этот модуль ejabberd:

-module(mod_test).

-author('').

-vsn('0.1').

-behavior(gen_mod).

-export([start/2, stop/1,process/2]).

%%
%% Includes
%%

%% base ejabberd headers
-include("ejabberd.hrl").

%% ejabberd compatibility functions
-include("jlib.hrl").

%% ejabberd HTTP headers
-include("web/ejabberd_http.hrl").

start(_Host, _Opts) ->
        ok.

stop(_Host) ->
        ok.

process(["register"], _Request) ->
        Data = _Request#request.data,
        {200,[],Data}.

И добавил прослушиватель http в ejabberd.cfg, я смог получить ответ, содержащий данные сообщения, НО, я не могу понять, как извлечь значения из данных.

например, я хочу, чтобы переменная Username получала значение ключа «username» («user») в данных POST.

Заранее спасибо, Матан.


person user1396033    schedule 20.05.2014    source источник


Ответы (1)


Ejabberd использует Jiffy, который является парсером Erlang JSON. Таким образом, вы можете использовать его для анализа полезной нагрузки POST HTTP-запроса внутри обработчика.

Запрос

$ curl \
   -XPOST http://localhost:5280/test/register \
   --data '{"username":"user","host":"test.com","password":"pass1"}'

Обработчик

process([<<"register">>], #request{method = 'POST', data = Data}) ->
    {JSON} = jiffy:decode(Data),
    User = proplists:get_value(<<"username">>, JSON),
    Host = proplists:get_value(<<"host">>, JSON),
    Pass = proplists:get_value(<<"password">>, JSON),

    %% do something with:
    %% User =:= <<"user">>
    %% Host =:= <<"test.com">>
    %% Pass =:= <<"pass1">>
    %% ...

    {200, [], <<"response">>};
process(_Call, _Req) ->
    {404, [], <<"not_found">>}.
person Hamidreza Soleimani    schedule 03.01.2016