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 сервера :-) ).