(возможно, немного обманчиво по имени) :uri
параметра разрешено быть либо строкой, либо предикат на объекте запроса. Таким образом, вы можете передать туда функцию, которая проверяет соответствие метода и пути. Я написал макрос, чтобы сделать его красивее:
(defmacro method-path (methods path)
"Expands to a predicate the returns true of the Hunchtoot request
has a SCRIPT-NAME matching the PATH and METHOD in the list of METHODS.
You may pass a single method as a designator for the list containing
only that method."
(declare
(type (or keyword list) methods)
(type string path))
`(lambda (request)
(and (member (hunchentoot:request-method* request)
,(if (keywordp methods)
`'(,methods)
`',methods))
(string= (hunchentoot:script-name* request)
,path))))
(hunchentoot:define-easy-handler (get-handler :uri (method-path :get "/hello"))()
"hello!")
(hunchentoot:define-easy-handler (post-handler :uri (method-path (:post :put) "/hello"))()
"a post or a put!")
В том случае, когда будет найден путь, но этот метод не мы, вероятно, следует возвращать ошибку HTTP 405 вместо ошибки 404, что Hunchentoot не возвращается, если нет обработчиков совпадение. Чтобы сделать это, вы можете вручную написать обработчик catch-all для каждого вашего пути. Предполагается, что ответ 405 включает список приемлемых методов, и я не могу придумать простой способ генерировать один из них, не изменяя define-easy-handler
, чтобы напрямую поддерживать специализацию по методу, что может быть хорошей идеей.
От взгляда на исходный код казалось бы, что 'default-requiest-type' влияет только на то, что« аргументы »учитываются при вызове обработчика. Это не влияет на вызов обработчика. Таким образом, похоже, что вы сами выполняете это. –
Спасибо за то, что посмотрели в источник для меня :) Думаю, мне нужно будет что-то реализовать самостоятельно для него – mck