Какая хорошая отправная точка для разработки веб-службы RESTful в Clojure?

Я изучаю что-то легкое, что, как минимум, должно поддерживать следующие функции:

  • Поддержка простого определения действий с помощью метаданных
  • Обертка, которая извлекает параметры из запроса на карту clojure или в качестве параметров функции
  • Поддержка нескольких форм аутентификации (основная, форма, cookie)
  • базовая авторизация на основе метаданных метода api
  • объект сеанса, завернутый в clojure map
  • живое кодирование от REPL (нет необходимости перезапускать сервер)
  • автоматическая сериализация возвращаемого значения в json и xml
  • имеют хорошую (подключаемую) обработку URL-адресов (например,/action/par1/par2 вместо /action? par1 = val1 & par2 = val2)

Я знаю, что относительно легко создать собственную микроархивировку для каждого из этих вариантов, но зачем изобретать колесо, если что-то подобное уже существует? Особенно, если это:

  • Активный проект с растущим числом участников/пользователей
  • По крайней мере, базовая документация и учебник онлайн.

Ответ 1

Прежде всего, я думаю, что вы вряд ли найдете одно решение, разрешенное для сжатия, чтобы сделать все это в Clojure (за исключением формы библиотеки Java, которая будет использоваться через interop). То, что становится стандартным веб-стеком Clojure, содержит ряд библиотек, которые люди смешивают и сопоставляют разными способами (поскольку они с удовольствием, как правило, идеально совместимы). 1

Вот список некоторых строительных блоков, которые могут вам пригодиться:

  • Ring - Clojure базовая библиотека обработки запросов HTTP; все остальные webby-библиотеки (для написания маршрутов и т.д.), которые, как я знаю, совместимы с Ring. Кольцо активно развивается, имеет надежное сообщество, очень хорошо написано и имеет хороший документ SPEC, в котором подробно изложена его философия дизайна. Это сообщение в блоге дает хороший пример того, как он может быть использован (реакция на GitHub фиксирует).

  • Sandbar - в настоящее время библиотека проверки подлинности, запланировано больше типов функциональности; в разработке.

  • Compojure - зрелая и надежная библиотека, которая обеспечивает хороший DSL для написания маршрутов, которые будут использоваться поверх Кольцо. Это даст вам хорошую обработку URL-адресов.

  • Compojure-rest -" библиотека для создания приложений RESTful поверх Compojure". Compojure-rest, насколько я могу судить, на ранних этапах его развития; возможно, вы можете увидеть это как возможность повлиять на его дизайн.: -)

  • Для работы с XML существует clojure.contrib.lazy-xml (и вспомогательная библиотека clojure.contrib.zip-filter.xml) и Enlive ( встроенное пространство имен clojure.xml в настоящее время не очень удобно); они будут использоваться в тандеме (хотя для ваших целей первое могло бы быть достаточным).

  • Для JSON есть библиотека в contrib и clojure-json (и я думаю, что была хотя бы одна другая lib я похоже, сейчас забывают...); выберите тот, который вам больше нравится.

Всем понравится стиль разработки, основанный на REPL (см. принятый ответ на этот SO-вопрос для трюка Ring, который очень важен для цели Вот). Я полагаю, что вышеупомянутая коллекция ссылок оставляет несколько слепых пятен (в частности, история аутентификации по-прежнему сглаживается, насколько я могу судить), но, надеюсь, это хороший старт.


1 Единственное одноплатное решение для построения webapps в Clojure, которое я знаю, это Conjure, вдохновленный Rails; к сожалению, я должен признать, что я мало знаю об этом, поэтому, если вам интересно, следуйте ссылке и посмотрите вокруг источников, wiki & c.

Ответ 2

При создании моего первого сервиса обслуживания Clojure я часто задавал себе тот же вопрос. Инструмент Clojure мне очень помог: http://www.clojure-toolbox.com/

Ответ 3

Если вы ищете какой-то образец, реальный, иллюстративный код, чтобы вы начали, тогда вы можете изучить этот clojure -news-feed on github, который демонстрирует, как реализовать нетривиальный веб-сервис RESTful с compojure/ring, который обертывает SQL (postgresql или mysql) и NoSQL (cassandra), поиск (solr), кеширование (redis), ведение журнала событий ( kafka), объединение пулов (c3po) и метрики реального времени через JMX.

Этот блог о Создание веб-службы масштабируемого новостного канала в Clojure дает хорошее представление. Я провел несколько нагрузочных тестов против этой службы при скромном развертывании AWS и получил около восьмидесяти транзакций в секунду с средней задержкой в ​​полсекунды за транзакцию.

Ответ 4

Взгляните на библиотеку освободителя http://clojure-liberator.github.io/liberator/ Это идеальное решение, покупайте очень хорошо для определения сервиса отдыха.