Pull to refresh

Разработка веб-приложений при помощи Webmachine

Reading time4 min
Views4K
Если вы по каким-либо причинам заинтересованы в разработке веб-приложения на Erlang, то у вас возникнет закономерный вопрос, какую из имеющихся технологий для этого использовать: взять один из существующих веб-серверов, таких как YAWS, Mochiweb, Misultin (назову их так, хотя некоторые из них называют себя фреймворком для построения веб-серверов) или воспользоваться чем-то готовым, например Zotonic CMS или Nitrogen.
Задавшись этим вопросом, вы наверняка найдёте этот пост на Stackoverflow, в котором довольно подробно рассмотрены все плюсы и минусы различных подходов.

В данной статье автор попытался раскрыть тему использования Webmachine для создания веб-ресурсов.

Итак, что же такое Webmachine? Как считают сами разработчики, нет однозначного ответа: то ли это веб-фреймворк, то ли инструментарий для создания REST-like веб-ресурсов. Автор придерживается мнения, что это способ описания состояния веб-сервиса при помощи предоставляемого инструментария.
Чем же интересен Webmachine?

dispatch.conf

Важной особенностью Webmachine является то, как запрос доходит до места назначения. Cуществует файл dispatch.conf, в котором определены правила сопоставления адреса запроса модулю его обработки. Данный модуль в терминах Webmachine называется ресурсом.

Пример сферического dispatch.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 обработается последним.

Flow Diagram

Ещё одно важное отличие Webmachine от большинства других технологий — разбиение процесса обработки запроса внутри ресурса на уровни в соответствии со следующей диаграммой:

Диаграмма процесса обработки HTTP запроса в Webmachine

Для каждого узла этой диаграммы есть функция-обработчик, решающая идти ли нам дальше, или остановиться. Для большей части узлов предоставляются разумные обработчики по умолчанию, таким образом, задача сводится к определению существенных для вашей цели узлов и реализации их логики.

Пример сферического ресурса:

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

В данном примере показано, что наш ресурс может выдавать данные как в «text/plain», так и в «text/html». Если в заголовке запроса вы установите «Accept:text/xml», то при обращении к данному ресурсу в ответ от сервера получите «HTTP/1.1 406 Not Acceptable». Аналогично и с методом запроса, если вы попытаетесь сделать «PUT» или «DELETE», то в ответ получите «HTTP/1.1 405 Method Not Allowed». Так же приведён простой пример basic-авторизации.

Встроенный веб-отладчик

Довольно полезным является механизм отладки приложения. Он представляет собой веб-ресурс, запущенный на всё том же Webmachine, при обращении к которому выводит на диаграмме весь оттрасированный путь вашего запроса и все промежуточные состояния. Пример работы отладчика можно посмотреть тут.

Шаблоны

Любители шаблонов и шаблонизаторов могут воспользоваться весьма функциональным портом Django Templates Language — 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

Более подробная документация на Wiki или на Github.

В комплекте с исходными текстами поставляется утилита для сборки rebar и скрипт запуска start.sh.
В папке priv находится dispatch.conf, в папке src — исходные коды ресурсов.

Заключение

Webmachine является гибкой и мощной платформой для создания веб-приложений на Erlang. Он довольно простой, но не примитивный, универсальный, но не всеобъемлющий. Это интересная технология, заслуживающая внимания разработчиков REST-like сервисов и веб-разработчиков.

P.S. Если чего-то не хватает в функциональности Webmachine, то можно спустится на уровень ниже и ковырнуть того кита, на котором он стоит (Mochiweb).

Пейте чай, пишите Erlang.
Tags:
Hubs:
+26
Comments23

Articles