REST интерфейс и публикация с помощью Git
Интересно экспериментировать с использованием различных технологий. Основная причина - изменение обычного хода вещей, приобретение новых навыков и опыта. Иногда это позволяет открыть для себя новые пути решения некоторых задач, но всегда расширяет кругозор.
Вызовы посредством REST
С недавнего времени, в качестве инструмента публикации, я использую curl (консольный WEB клиент). Смена обычного способа (с помощью браузера) стала возможной благодаря технологии REST. Теперь моя шпаргалка для работы с сайтом выглядит следующим образом:
curl -X POST -D - -u xxxxxx:XXXXXXX -T File.pod http://zag.ru/New/b
curl -X GET -D - -o File.pod http://zag.ru/2010/309/b1/Perl6-Pod-kod-formatirovanija-E-opredelenie-sushhnostej.pod
curl -X PUT -D - -u xxxxxx:XXXXXXX -T File.pod http://zag.ru/2010/309/b1/Perl6-Pod-kod-formatirovanija-E-opredelenie-sushhnostej.pod
curl -X DELETE -D - -u xxxxxx:XXXXXXX http://zag.ru/2010/309/b1/Perl6-Pod-kod-formatirovanija-E-opredelenie-sushhnostej.pod
Во время реализации REST доступа я встретил следующие интересные ссылки:
Следующий пример весьма нагляден:
use Router::Resource;
use Plack::Builder;
use namespace::autoclean;
sub app {
# Create a routing table.
my $router = router {
resource '/' => sub {
GET { $template->render('home') };
};
resource '/blog/{year}/{month}' => sub {
GET { [200, [], [ $template->render({ posts => \@posts }) ] };
POST { push @posts, new_post(shift); [200, [], ['ok']] };
};
};
# Build the Plack app to use it.
builder {
sub { $router->dispatch(shift) };
};
}
Публикация с помощью Git
Моим основным редактором является Vim. А для написания статей я использую формат Perl 6 Pod . Хранятся статьи и сопутствующие им материалы в Git. Структура каталогов выглядит следующим образом:
4 drwxr-xr-x 6 zag zag 4096 Nov 6 08:54 .
4 drwxrwxrwx 4 root root 4096 Nov 6 07:26 ..
4 drwxr-xr-x 8 zag zag 4096 Oct 31 15:45 .git
4 -rw-r--r-- 1 zag zag 349 Oct 31 15:43 README
4 drwxr-xr-x 2 zag zag 4096 Oct 31 15:45 bin
4 drwxr-xr-x 2 zag zag 4096 Nov 6 08:54 draft
4 drwxr-xr-x 2 zag zag 4096 Nov 6 08:54 pub
В файле README - шпаргалка по командам curl, bin - каталог с скриптами, draft - каталог с черновиками, а в каталоге pub располагаются готовые материалы.
После "механизации" блога посредством REST, стало возможным просто автоматизировать и сам процесс публикации. Для этого был поднят сервер Git - gitosis ( согласно инструкции по настройке Gitosis ). На сервере Git уставлен post-receive Hook, который игнорирует изменения в файлах, расположенных вне каталога pub. А для файлов расположенных в pub создает или обновляет записи на zag.ru.
После готовности материалов к публикации, выполняется команда mv:
git mv draft/rest_git pub/201011
git commit
git push
Материалы из каталога draft оказываются в pub, и поэтому все изменения в этих файлах публикуются на сайте.
В качестве Git сервера можно использовать сервис GitHub. Он предоставляет уведомления Post-Receive Hooks , которые можно использовать для выполнения каких-либо действий.
Таким образом в результате получилось окружение, которое включает в себя распределенное хранилище материалов, совмещенное с их публикацией.
( Теперь можно иногда проводить время в темной текстовой консоли, а то и совсем отказаться от X сервера :-) ).