【问题标题】:Erlang Cowboy Constraints CodingErlang Cowboy 约束编码
【发布时间】:2019-07-10 23:10:24
【问题描述】:
{"/:myobj/get:id",Constraints, constraints_handler, [list]},
{"/:myobj/list",Constraints, constraints_handler, [list]},
{"/:myobj/save",Constraints, constraints_handler, [save]},
{"/:myobj/update",Constraints, constraints_handler, [update]},
{"/:myobj/delete",Constraints, constraints_handler, [delete]}

请帮我编写约束代码,其中 :myobj 将是一个没有空格和特殊字符的字符串值。和 :id 将是 int。

【问题讨论】:

  • 1) 你认为什么是“特殊字符”? 2)“没有”是指“删除”还是“转换”? 3)您感兴趣的路线是否正确?路线不应该是:"/:myobj/get/:id"

标签: erlang constraints handler cowboy


【解决方案1】:

hello_erlang_app.erl

-module(hello_erlang_app).
-behaviour(application).

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

positive_fun(forward, Value) when Value > 0 -> 
    {ok, Value};
positive_fun(forward, _) ->
    {error, not_positive}.
%Not for route constraints:
%positive_fun(format_error, {not_positive, Value}) ->
%    io_lib:format("The value ~p is not an integer.", [Value]).

convert(forward, Value) ->
    DecodedValue = cow_qs:urldecode(Value),
    NoSpaces = re:replace(DecodedValue, " ", "", [global, {return, list}]),
    {ok, NoSpaces}. 

start(_Type, _Args) ->
    MyObjConstraints = { myobj, [fun convert/2] },
    IdConstraints = { id, [int, fun positive_fun/2] },

    IdRoute = { "/:myobj/get/:id", 
                 [MyObjConstraints, IdConstraints],  
                 id_handler, 
                 []
              }, %The last arg becomes the State 
                 %arg in the id_handler's init() method.

    CatchallRoute = {"/[...]", no_matching_route_handler, []},

    Dispatch = cowboy_router:compile([
        {'_', [IdRoute, CatchallRoute]}
    ]), 

    {ok, _} = cowboy:start_clear(my_http_listener,
        [{port, 8080}],
        #{env => #{dispatch => Dispatch} }
    ),

    hello_erlang_sup:start_link().


stop(_State) ->
    ok.

id_handler.erl

-module(id_handler).
-behavior(cowboy_handler).

-export([init/2]).

init(Req0, State) -> %State comes from last argument of the route
    MyObj = cowboy_req:binding(myobj, Req0),
    Id = cowboy_req:binding(id, Req0),
    Reply = io_lib:format("Hello Erlang~nMyObj=~p~nId=~w~n", [MyObj, Id]),

    Req = cowboy_req:reply(200,
        #{<<"content-type">> => <<"text/plain">>},
        Reply,
        Req0),
    {ok, Req, State}.

no_matching_route_handler.erl

-module(no_matching_route_handler).
-behavior(cowboy_handler).

-export([init/2]).

init(Req0, State) -> %State comes from last argument of the route
    Req = cowboy_req:reply(404,
        #{<<"content-type">> => <<"text/plain">>},
        <<"[ME] 404. Whoops! (No matching route!)">>,
        Req0),
    {ok, Req, State}.

生成文件

PROJECT = hello_erlang
PROJECT_DESCRIPTION = New project
PROJECT_VERSION = 0.1.0

DEPS = cowboy
#dep_cowboy_commit = master
dep_cowboy_commit = 2.6.1


DEP_PLUGINS = cowboy

include erlang.mk

一些例子:

url in browser: http://localhost:8080/dog/get/1

response:

    Hello Erlang
    MyObj="dog"
    Id=1

url in browser: http://localhost:8080/dog/get/-4

response:

    [ME] 404. Whoops! (No matching route!)

url in browser: http://localhost:8080/h%20e%20l%20l%20o/get/1

response:

    Hello Erlang
    MyObj="hello"
    Id=1

url in browser: http://localhost:8080/hello%28%27arg%27%29/get/1

response:

    Hello Erlang
    MyObj="hello('arg')"
    Id=1

url in browser: http://localhost:8080/h%20e%20l%20l%20o%28%27arg%27%29/get/1

response:

    Hello Erlang
    MyObj="hello('arg')"
    Id=1

【讨论】:

  • 非常感谢。这真的很有帮助。
猜你喜欢
  • 2013-10-22
  • 2018-04-24
  • 2012-10-10
  • 2013-09-26
  • 2011-07-20
  • 1970-01-01
  • 2020-09-05
  • 2015-12-06
  • 2016-03-18
相关资源
最近更新 更多