(可能有点欺骗性地命名):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 错误,而不是 Hunchentoot 在没有匹配的处理程序时返回的 404 错误。为此,您可以为您定义的每个路径手动编写一个包罗万象的处理程序。405 响应应该包含一个可接受的方法列表,我想不出一种简单的方法来生成一个缺少修改define-easy-handler
以直接支持方法专业化的方法,这可能是一个好主意。