牛仔的多个休息处理程序

时间:2015-02-17 19:14:10

标签: rest erlang cowboy

是否有一种简单的方法可以在Cowboy中设置单个调度路由,允许多个处理程序,例如: /碱/ add_something /碱/ remove_something

并通过一个可以区分它们的处理程序使每个操作服务?所有示例似乎都将1个处理程序映射到1个调度,如果可能,我想整合功能。

2 个答案:

答案 0 :(得分:5)

你可以这样做:

急件:

...
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}.
...

等等。

答案 1 :(得分:0)

您也可以尝试使用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.