Всегда есть только один обработчик верхнего уровня - в конце концов, даже если на каком-то концептуальном уровне есть несколько обработчиков, приложение должно решить, какой из них применить к данному запросу так или иначе, поэтому процедура, которая делает выбор получателем верхнего уровня. Итак, короткий ответ заключается в том, что вам нужно предоставить функцию, которая будет рассматривать запрос и передать его соответствующему обработчику среди нескольких обработчиков внутри вашего приложения; эта функция является обработчиком, который должен быть присвоен run-jetty
(или эквивалент).
Обычно с Ring + Compojure у вас есть базовые («внутренние») обработчики, предназначенные для обработки определенных URI и некоторых специальных обработчиков (скажем, для 404), реализованных в качестве промежуточного программного обеспечения. Первые, как правило, определяются в формах defroutes
, а последние - функции более высокого порядка.
Обработчики промежуточного программного обеспечения сами решают - посмотрев запрос - хотите ли они немедленно вернуть ответ или делегировать обработчикам, они обернуты. «Внутренние» обработчики на основе маршрута вызываются для соответствующих URI и имеют возможность возвращать nil
, чтобы указать, что запрос не имеет для них смысла (после чего проверяются остальные обработчики на основе маршрутов, если все nil
, окончательный ответ обычно генерируется некоторым фрагментом промежуточного программного обеспечения, возможно, возвращением 404).
Я написал длинный ответ относительно Compojure here; возможно, это может помочь в сборе определений обработчиков на основе маршрутов Compojure.
Спасибо, я очень устал и не думал четко :) Это имеет большой смысл :) Достаточно смешно, что я написал твиттер вашего другого сообщения 1 день назад: http://twitter.com/#!/zemariamm/status/ 15553561278550016 Cheers :) – user361526 2010-12-17 10:03:42