Compojure - как вернуть 404, если необходимые параметры не предоставлены? - PullRequest
2 голосов
/ 24 февраля 2012

Предположим, у меня есть этот обработчик:

(defroutes routes
  (DELETE    "/books"      [id]              (delete-book id)))

Что можно сделать, чтобы приложение вернуло HTTP 404, если запрос не содержит идентификатора?

1 Ответ

5 голосов
/ 24 февраля 2012

Во-первых, вы могли бы сделать 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 формах.

...