Всегда будет только один обработчик верхнего уровня - в конце концов, даже если на каком-то концептуальном уровне есть несколько обработчиков, приложение должно решить, какой из них как-то применить к данному запросу, поэтому процедура, которая делаетвыбор становится обработчиком верхнего уровня.Итак, короткий ответ заключается в том, что вам нужно предоставить функцию, которая будет смотреть на запрос и передавать его соответствующему обработчику среди нескольких обработчиков в вашем приложении;эта функция является обработчиком для run-jetty
(или эквивалентного).
Обычно с Ring + Compojure у вас есть несколько базовых («внутренних») обработчиков, предназначенных для обработки определенных URI и некоторых специальныхцелевые обработчики (скажем, для 404) реализованы как промежуточное ПО.Первые, как правило, определяются в формах defroutes
, а вторые являются функциями более высокого порядка.
Обработчики промежуточного программного обеспечения сами решают - после просмотра запроса - хотят ли они немедленно вернуть ответ илиделегировать обработчикам они обернуты вокруг.«Внутренние» обработчики на основе маршрута вызываются для соответствующих URI и имеют возможность вернуть nil
, чтобы указать, что запрос не имеет для них смысла (в этот момент пробуются остальные обработчики на основе маршрута; если всеnil
, окончательный ответ обычно генерируется каким-то промежуточным программным обеспечением, возможно, возвращающим 404).
Я написал длинный ответ относительно Compojure здесь ;возможно, это могло бы оказать некоторую помощь в освоении определений, основанных на маршрутах Compojure.