Что является хорошей отправной точкой для разработки веб-сервиса RESTful в Clojure? - PullRequest
42 голосов
/ 05 июля 2010

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

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

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

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

Ответы [ 5 ]

54 голосов
/ 05 июля 2010

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

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

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

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

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

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

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

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

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


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

7 голосов
/ 17 сентября 2013

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

1 голос
/ 24 февраля 2014

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

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

0 голосов
/ 16 мая 2018

Просто чтобы дать обновленный ответ на этот старый вопрос, в настоящее время (в 2018 году) я думаю, что Luminus обеспечивает отличную отправную точку.Он использует многие из библиотек (ring, compojure и т. Д.), Упомянутых в предыдущих ответах, является модульным и максимально приближенным к «единому пакету», который вы можете получить с помощью Clojure.Специально для REST взгляните на compojure-api .Luminus рекомендует приятель для проверки подлинности, я имел хороший успех, используя его как для традиционной аутентификации на основе сеансов, так и для Oauth и JWT без сохранения состояния.

0 голосов
/ 07 декабря 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...