рдпрджрд┐ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЖрдк Erlang рдкрд░ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рд╢реНрди рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ: рдореМрдЬреВрджрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬреИрд╕реЗ YAWS, Mochiweb, Misultin (рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдХрд╣реВрдВрдЧрд╛ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЦреБрдж рдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдврд╛рдВрдЪрд╛ рдХрд╣рддреЗ рд╣реИрдВ) рдпрд╛ рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╝реЛрдЯреЛрдирд┐рдХ рд╕реАрдПрдордПрд╕ рдпрд╛ рдирд╛рдЗрдЯреНрд░реЛрдЬрдиред
рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рдкреВрдЫрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд╕рднреА рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Webmachine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рддреЛ Webmachine рдХреНрдпрд╛ рд╣реИ? рдЦреБрдж рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдХрд╛ рдХреЛрдИ рдПрдХрд▓ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ: рдпрд╛ рддреЛ рдпрд╣ рдПрдХ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдпрд╛ REST рдЬреИрд╕реЗ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рд▓реЗрдЦрдХ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдФрдЬрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
Webmachine рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?
dispatch.conf
Webmachine рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдкрдиреЗ рдЧрдВрддрд╡реНрдп рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдПрдХ
рдкреНрд░реЗрд╖рдг .conf рдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрддреЗ рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ Webmachine рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░
рдкреНрд░реЗрд╖рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг
редconf :
%%-*- mode: erlang -*-
{["page1", "subpage11"], page11_resource, []}.
{["page1", "subpage12"], page12_resource, [{is_protected, true}]}.
{["page2", '*'], page2_resource, []}.
{['*'], default_resource, []}.
рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реИрдВред рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╡рд╣ рдирд┐рдпрдо рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЕрдиреБрд░реЛрдз рдЗрди рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рд▓рд╛рдЗрди рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдВрд╕рд╛рдзрди рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рднрд╛рдЧ рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдХреЗ
init рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ Webmachine
localhost:8000
рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ
localhost:8000/page1/subpage12
рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рддрд╣рдд рдЖрддреА рд╣реИ, рдФрд░
localhost:8000/unknown_url/subpage42
рдЕрдВрддрд┐рдо рд░реВрдк
localhost:8000/unknown_url/subpage42
рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛
localhost:8000/unknown_url/subpage42
рд╣реИред
рдкреНрд░рд╡рд╛рд╣ рдЖрд░реЗрдЦ
рд╡реЗрдмрдореИрдЪрд┐рди рдФрд░ рдЕрдиреНрдп рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
рдбрд╛рдпрдЧреНрд░рд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рднреАрддрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЯреВрдЯрдирд╛ рд╣реИ:

рдЗрд╕ рдЖрд░реЗрдЦ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдЬрд╛рдирд╛ рд╣реИ рдпрд╛ рд░реЛрдХрдирд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдп рдЙрди рдиреЛрдбреНрд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
-module(page12_resource).
-export([init/1, is_authorized/2, content_types_provided/2, allowed_methods/2, to_html/2, to_text/2]).
-include_lib("webmachine/include/webmachine.hrl").
init(InitArgsFromDispatchConf) -> {ok, InitArgsFromDispatchConf}.
content_types_provided(Request, Context) ->
{[{"text/html", to_html},{"text/plain",to_text}], Request, Context}.
allowed_methods(Request, Context) ->
{['GET', 'POST'], Request, Context}.
is_authorized(Request, Context) ->
case wrq:get_req_header("Authorization", ReqData) of
"Basic "++Base64 ->
Str = base64:mime_decode_to_string(Base64),
case string:tokens(Str, ":") of
["authdemo", "demo1"] ->
{true, Request, Context};
_ ->
{"Basic realm=webmachine", Request, Context}
end;
_ ->
case proplists:get_value(is_protected, Context, false) of
false -> {true, Request, Context};
_ -> {"Basic realm=webmachine", Request, Context}
end
end.
to_html(Request, Context) -> {"Hello, html world", Request, Context}.
to_text(Request, Context) -> {"Hello, text world", Request, Context}.
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрди "рдЯреЗрдХреНрд╕реНрдЯ / рд╕рд╛рджреЗ" рдФрд░ "рдЯреЗрдХреНрд╕реНрдЯ / html" рджреЛрдиреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреБрд░реЛрдз рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ "рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ: рдкрд╛рда / xml" рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ "HTTP / 1.1 406 рдирд╣реАрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп" рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдЖрдк "PUT" рдпрд╛ "DELETE" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рдореЗрдВ "HTTP / 1.1 405 Method Not Allowed" рдорд┐рд▓реЗрдЧрд╛ред рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХреАрдХреГрдд рд╡реЗрдм рдбрд┐рдмрдЧрд░
рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИред рдпрд╣ рдПрдХ рд╣реА Webmachine рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рд╣реИред рдЬрдм рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд░реЗрдЦ рдкрд░ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдФрд░ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдЯреНрд░реИрд╕ рдХрд┐рдП рдЧрдП рдкрде рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдбрд┐рдмрдЧрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕
рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ Django рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рд▓реИрдВрдЧреНрд╡реЗрдЬ -
ErlyDtl рдХреЗ рдмрд╣реБрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╣рд╛рдБ рд╕реЗ рд▓рд╛рдКрдБ?
Webmachine рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
git clone github.com/basho/webmachine.git
cd webmachine && ./scripts/new_webmachine.sh mydemo ~/webmachine_applications
cd ~/webmachine_applications/mydemo && make && ./start.sh
рд╡рд┐рдХреА рдпрд╛
рдЬреАрдердм рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд▓реЗрдЦрдиред
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдПрдХ
rebar рдмрд┐рд▓реНрдб рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рдПрдХ
start.sh рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред
рдирд┐рдЬреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
рдкреНрд░реЗрд╖рдг рд╣реИ
редconf ,
src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
Webmachine Erlang рдкрд░ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдордВрдЪ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрджрд┐рдо рдирд╣реАрдВ, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдЖрд░рдИрдПрд╕рдЯреА рдЬреИрд╕реА рд╕реЗрд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИред
PS рдпрджрд┐ рд╡реЗрдмрдореИрдЪ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЖрдк рдиреАрдЪреЗ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╡реНрд╣реЗрд▓ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдЦрдбрд╝рд╛ рд╣реИ (рдореЛрдЪреАрд╡реНрдм)ред
рдЪрд╛рдп рдкрд┐рдпреЛ, рдПрд░реНрд▓рд╛рдВрдЧ рд▓рд┐рдЦреЛред