Во-первых, вы могли бы сделать id
частью URI, что выглядит красиво и RESTful и позволит вам использовать синтаксис маршрута для наложения вашего условия:
(GET ["/books/:id" :id #"[0-9]+"] [] ...)
Если вы предпочитаете использовать параметр, что-то вроде
(if-not id
(ring.util.response/not-found body-for-404)
...)
должно работать в следующей версии Ring, хотя эта конкретная функция еще не была выпущена (хотя она просто возвращает {:status 404 :headers {} :body the-body}
).
Кроме того,
(when id
...)
приведет к эквиваленту ошибки при сопоставлении маршрута, и остальные маршруты будут опробованы; тогда вы могли бы использовать
(compojure.route/not-found body-for-404)
как последний маршрут, который всегда будет совпадать.
Наконец, если вы хотите применить фильтрацию к большой группе обработчиков Compojure, вы можете объединить их в один обработчик с defroutes
или routes
Compojure (последний является функцией) и обернуть их в часть промежуточного программного обеспечения:
(defn wrap-404 [handler]
(fn wrap-404 [request]
(when (-> request :params :id)
(handler request))))
Затем вы можете включить обработчик в виде записи в routes
/ defroutes
формах.