Несколько обработчиков отдыха в Cowboy

Есть ли простой способ настроить единый маршрут отправки в Cowboy, который позволяет использовать несколько обработчиков, таких как: /base/add_something /base/remove_something

и есть ли у каждого из этих действий один обработчик, который может их различать? Кажется, что все примеры сопоставляют 1 обработчик с 1 отправкой, я хотел бы объединить функциональность, если это возможно.


person Matt    schedule 17.02.2015    source источник


Ответы (2)


Ты можешь сделать это:

Отправлять:

...
Dispatch = cowboy_router:compile(
             [{'_', [{"/base/:action", 
                      [{type,
                        function,
                        is_in_list([<<"add_something">>,
                                    <<"remove_something">>])}], 
                      app_handler, []}]}]),
...
is_in_list(L) ->
    fun(Value) -> lists:member(Value, L) end.
...

В app_handler.erl:

...
-record(state, {action :: binary()}).
...
rest_init(Req, Opts) ->
    {Action, Req2} = cowboy_req:binding(action, Req),
    {ok, Req2, #state{action=Action}}.
...
allowed_methods(Req, #state{action=<<"add_something">>}=State) ->
    {[<<"POST">>], Req, State};
allowed_methods(Req, #state{action=<<"remove_something">>}=State) ->
    {[<<"DELETE">>], Req, State}.
...

и так далее.

person P_A    schedule 19.02.2015
comment
Большое спасибо, так и будет. Кажется, предпочтительным методом являются отдельные модули обработчиков, но теперь у меня есть вариант. Ценится. - person Matt; 19.02.2015

Вы также можете попробовать использовать cowboy_rest следующим образом:

content_types_accepted(Req, State) ->
   case cowboy_req:method(Req) of
     {<<"POST">>, _ } ->
       Accepted = {[{<<"application/json">>, post_json}], Req, State};
     {<<"PUT">>, _ } ->
       Accepted = {[{<<"application/json">>, put_json}], Req, State}
   end,
Accepted.
person Oladipo Olasemo    schedule 05.09.2017